C#: 引用变量与数值变量
2013-03-05 12:33
218 查看
在C#中主要存在两大类型的数据:引用类型(class)和值类型(struct)。本文探讨一下C#中引用变量和数值变量的区别。
编译上述代码,程序将输出:
i=1,j=2
在方法中,引用型参数通常已经初始化。再看下面的例子。
编译上述代码,程序将输出:
i=2,j=1
Main函数中调用了Swap函数,x代表i,y代表j。这样,调用成功地实现了i和j的值交换。
在方法中使用引用型参数,会经常可能导致多个变量名指向同一处内存地址。见示例:
在方法G对F的调用过程中,s的引用被同时传递给了a和b。此时,s,a,b同时指向了同一块内存区域。
1. 值参数
当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法。被调用的方法不传经修改内存中实参的值,所以使用值参数时,可以保证实际值是安全的。在调用方法时,如果形式化参数的类型是值参数的话,调用的实参的值必须保证是正确的值表达式。在下面的例子中,程序员并没有实现他希望交换值的目的:using System; class Test { static void Swap(int x,int y){ int temp=x; x=y; y=temp; } static void Main(){ int i=1,j=2; Swap(i,j); Console.WriteLine("i={0},j={1}",i,j); } }
编译上述代码,程序将输出:
i=1,j=2
2. 引用型参数
和值参不同的是,引用型参数并不开辟新的内存区域。当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法。在方法中,引用型参数通常已经初始化。再看下面的例子。
using System; class Test { static void Swap(ref int x,ref int y){ int temp=x; x=y; y=temp; } static void Main(){ int i=1,j=2; Swap(ref i,ref j); Console.WriteLine("i={0},j={1}",i,j); } }
编译上述代码,程序将输出:
i=2,j=1
Main函数中调用了Swap函数,x代表i,y代表j。这样,调用成功地实现了i和j的值交换。
在方法中使用引用型参数,会经常可能导致多个变量名指向同一处内存地址。见示例:
class A { string s; void F(ref string a,ref string b){ s="One"; a="Two"; b="Three"; } void G(){ F(ref s,ref s); } }
在方法G对F的调用过程中,s的引用被同时传递给了a和b。此时,s,a,b同时指向了同一块内存区域。
相关文章推荐
- C#: 引用变量与数值变量的区别
- 17.2015.08.04第十八节课 C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)
- 【C#】变量的定义,值、引用以及枚举类型详解说明
- c#新手入门级代码分享 枚举类型。输出数值所对应的变量名称
- C#变量的作用范围(和oc强引用的对比)
- C# 引用其他命名空间的公共变量时的警告:由于"***"是引用封送类的字段,访问上面的成员可能导致运行时异常
- C# 类中变量初始化:字段初始值无法引用非静态字段、方法或属性
- C#变量引用与全局变量
- c#各个窗体间变量和空间相互引用方法
- 【C#】显示引用类型变量的内存地址(以字符串为例)
- c#各个窗体间变量和空间相互引用方法
- C#利用类型引用改变private类型变量的值
- c#各个窗体间变量和空间相互引用方法
- c#变量缺少using引用,如何快速加上using,加Using的快捷键[bubuko.com]
- C# 定义了 7 种变量类别:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量
- C# 值类型、引用类型、装箱和拆箱、变量和常量
- 为什么返回值为数值时,返回局部变量可以,而返回值为引用时,返回局部变量不可以?
- c# out ref 引用传递,借用变量返回多个值
- C# 中 如果变量在函数体内申明并使用 则常出现空引用在未知模块的异常
- [C#]变量初始化问题:字段初始值无法引用非静态字段、方法或属性