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

  • 相关阅读:
    ILM --interface logic model
    dbGet net trace instant pin
    LIST 列表
    Getopt::Long
    TCL Strings
    MBA 报考
    英语 口译考试
    微服务了解
    解析微服务架构(三):微服务重构应用及IBM解决方案
    解析微服务架构(二):融入微服务的企业集成架构
  • 原文地址:https://www.cnblogs.com/pfcan66/p/2688815.html
Copyright © 2020-2023  润新知