对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’值了。

原文地址:https://www.cnblogs.com/pfcan66/p/2688815.html