对C#数据类型的简单理解(value与ref区别、ref与out区别)
值类型:1、简单类型(整型(byte、sbyte、long、ulong、short、ushort、 int、uint)、浮点数类型(float、double)、十进制类型(decimal)、字符类型(char)、布尔型(bool)) 2、枚举类型(enum) 3、结构类型(struct) 4、可以为null的类型
引用类型:1、类类型(class、object、string)2、接口类型(interface) 3、数组类型(array) 4、委托类型(delegate)
值类型数据的每个变量,都有自己的数据副本,因此对一个变量的操作不影响另一个变量。当在所调用的方法中修改该变量值时,修改的只是它的副本,而本身却没变,将该值输出还是原来的值。
引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。
下面实例来体现:
View Code
1 class DataType 2 { 3 class A 4 { 5 public int Value = 0; 6 } 7 8 static void Main(string[] args) 9 { 10 //所调用的方法中修改该变量值时,修改的只是它的副本 11 int num = 6; 12 changV(num);//ref num 13 Console.WriteLine(num); 14 15 //对一个变量的操作不影响另一个变量 16 int V1 = 0; 17 int V2 = V1; 18 V2 = 123; 19 20 //对一个变量的操作可能影响另一个变量所引用的对象 21 A ref1 = new A(); 22 A ref2 = ref1; 23 ref2.Value = 123; 24 Console .WriteLine ("Values:{0},{1}",V1,V2 ); 25 Console.WriteLine("Refs:{0},{1}", ref1.Value, ref2.Value); 26 Console.Read(); 27 } 28 29 public static void changV(int Num)//ref int Num 30 { 31 Num = 8; 32 } 33 }
将changV方法的参数改成引用类型参数,参照注释所示,运行一次,就能真正理解值类型与引用类型区别
接下来说一下ref与out区别:
1、使用ref型参数时传入的参数必须先被初始化,对out面言,必须在方法中对其完成初始化(changV改成引用类型参数,如果不给‘num’赋初值会报错)。
2、out适合用在需要return多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用对象(changV改成引用类型参数,就能改变‘num’值了)。
View Code
1 static void Main(string[] args) 2 { 3 //TryParse需要返回两个值,一、是否转换成功,bool型的,二、转换后的值,这里就是用输出参数‘iNum’接收转换后的值的 4 int iNum;//无需初始化 5 if (!int.TryParse("5s", out iNum)) 6 { 7 Console.WriteLine("对不起,转换不成功!"); 8 } 9 else 10 { 11 Console.WriteLine(iNum.ToString()); 12 } 13 }
将‘5s’改成数值型的,就能输出‘iNum’值了。