c#基础语言编程-按值类型和引用类型传递参数
引言
在介绍传递参数介绍前,请明白参数类型和传递方式是不同的。传递方式分为按值类型和引用类型传递参数。参数类型有值类型和引用类型,这个和C++是不同的。这里的传递方式对应c++中的深复制和浅复制。
两钟传递方式不同的标志为在调用函数中是否有ref,out这些标志,有的话,则为按引用传递,没有的话就是按值类型传递参数,根据参数类型的不同,可以分为按值传递值类型参数、按值传递引用类型、按引用传递值类型、按引用传递引用类型。
例子介绍
//按值传递值类型参数
private static void M1( int m)
{
m++;
}
//按值传递引用类型参数,也可以传递类对象、数组、接口、委托等等都是引用类型参数
private static void M5( string name2)
{
name2 = "乔丹";
}
// 如果类似在参数中添加ref关键词,则意味这是按引用传递参数,无论是值类型参数还是引用类型参数。
//调用
string name = "科比";
M5(name);
Console.WriteLine(name);//输出科比
//如果改为:
M5(ref name);//当然M5中参数前加关键词ref
Console.WriteLine(name);//乔丹
上面中按传递值类型参数更容易理解。
机制解析
值传递,传递的是栈中的内容,(对于值类型,栈中的内容就是对应的数据。对于引用类型栈中内容就是对象的地址)。
引用传递,传递的是栈本身的地址,多个变量名实际上指向的是同一个栈变量。
引用传递必须使用ref关键字修饰。在方法调用的时候传递参数的时候也必须加ref 关键字。
按照上图解析,在调用时
1、确定传递类型
2、确定参数类型
3、调用操作
在按值类型传递时,则在堆栈中进行操作,首先在栈中申请内存区域,讲复制得到的值拷贝其中,如果是值类型参数,就将值拷贝到新申请的区域。如果是引用类型参数,将对象在栈中地址拷贝一份。因为数据是在堆中,类似在堆中的数据有了两个指针,操作那个指针,里面的数据都会变化。但是如果new个对象时,意味着那就是在堆中有新的对象,数据也会不一样。参照M5调用。
按引用传递时,则是将栈中地址进行拷贝,这就是深复制了。在函数调用时,传递的是栈中地址,意味着函数中操作就是对栈中地址中的数据进行操作了。所以在引用类型中,就是new个对象,意味着栈中地址指向改变,所以返回时,数据会有所改变。
c#基础语言编程-按值类型和引用类型传递参数的更多相关文章
- C#基础(六)——值类型与引用类型
CLR支持两种类型:值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型 ...
- Go语言中的值类型和引用类型
一.值类型和引用类型值类型:int.float.bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中.当使用等号=将一个变量的值赋给另一个变 ...
- C++ 值类型和引用类型传递示例
// win32test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" void swap_point(int * &a , in ...
- Java的值类型和引用类型
一.问题描述 前几天因为一个需求出现了Bug.说高级点也挺高级,说白点也很简单.其实也就是一个很简单的Java基础入门时候的值类型和引用类型的区别.只是开发的时候由于自己的问题,导致小问题的出现.还好 ...
- Docs-.NET-C#-指南-语言参考-关键字-值类型:enum
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:enum 1.返回顶部 1. enum(C# 参考) 2015/07/20 enum 关键字用于声明枚举,一种包含一组被称为枚 ...
- [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...
- .NET基础知识(01)-值类型与引用类型
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...
- C#面试基础知识点:值类型和引用类型(1)(填坑文)
目录 前言 C#值类型和引用类型 基类(共同点) 值类型继承基类(不同点) 应用类型继承 技术经理的问题 值类型与引用类型都可以用Equals来比较吗? 如何将一个数组a的值赋予数组b然后对b做修改而 ...
- Docs-.NET-C#-指南-语言参考-关键字-值类型:struct
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:struct 1.返回顶部 1. struct(C# 参考) 2015/07/20 struct 类型是一种值类型,通常用来封 ...
随机推荐
- 中文翻译:pjsip教程(三)之ICE stream transport的使用
1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...
- js 之 json
/*JSON语法数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组 JSON 数据的书写格式是:名称/值对名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值;如"myw ...
- [转] 属性选择器.mark
CSS 2 引入了属性选择器. 属性选择器可以根据元素的属性及属性值来选择元素. 简单属性选择 如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器. 例子 1 如果您希望把包含标 ...
- js 中特殊形势的函数-匿名函数的应用
javascript中的匿名函数,那什么叫做匿名函数? 匿名函数就是没有函数名称:演示代码: <script> function(x,y){ return x+y //这个就是一个匿名函数 ...
- ThinkPHP HTML标签代码和UBB互相转换
1.UBB 转为 HTML TP的扩展里面自带一个ubb方法,用这个方法就能把用户输入的ubb格式代码转换为HTML标签的代码.这里用到的基本知识就是正则表达式啦,今天先不讲正则表达式. 来看一下TP ...
- Dalvik虚拟机进程和线程的创建过程分析
从前面Dalvik虚拟机的运行过程分析一文可以知道,Dalvik虚拟机除了可以执行Java代码之外,还可以执行Native代码,也就是C/C++函数. 这些C/C++函数在执行的过程中,又可以通过本地 ...
- auto_ptr, which can release the space automatically
C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理. 使用std::auto_ptr,要#include <memory>.[1] 中文名 自动指针 外 ...
- ARM的STRB和LDRB指令分析
一.SDRAM 1.存储结构 SDRAM的内部是一个存储阵列.阵列就如同表格一样,将数据“填”进去.在数据读写时和表格的检索原理一样,先指定一个行(Row),再指定一个列 (Column),我们就可以 ...
- jquery实现表格可变列宽插件开发
工作中用到了表格的可变列宽,网上看了下,自己也实现了一个,整理贴记录. 测试环境chrome,ie8,firefox jquery版本1.8.2 原理:监听table第一行的mousemove事件,当 ...
- SAP Crystal Dashboard Design 2011 win7 x64 安装
suggest: unZip the setup package to C:\dashboard\ (make sure that the path cannot contain non-unico ...