• C#值类型与引用类型之我见


    值类型与引用类型的最大区别是值类型被分配的存贮空间是在栈里,引用类型被分析的空间是在堆内存中。

    那什么类型是值类型有哪些,哪些是引用类型呢?

    值类型:基元类型、枚举类型、结构体。

    引用类型:类、字符串、标准模块、接口、数组和委托。

    那怎么根据它们的表相来区别值类型与引用类型呢?

    方案1:使用系统Type属性判定

    隐藏行号 复制代码 这是一段程序代码。
    1. public bool IsValueType<T>()
      
    2. {
      
    3.     return typeof(T).IsValueType;
      
    4. }
      

    方案2:用是否可为空来判断(歪招)

    值引用默认是不能为空的。如int i=null;在VS的编译器里就会提示

    image

    引用类型是默认可以为空的,如string str=null,是正确的。

    关于值引用与类型引用,除了编程时经常需要区分以外,还经常被用来考察一个程序员的基本功,出现在面试题或者是考试中,怎么考察呢?

    依据:值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。

    可能你就会遇到以下一段代码,让你写出最后的输出结果:

    隐藏行号 复制代码 这是一段程序代码。
    1. public void PrintTheResultString()
      
    2. {
      
    3.     Console.WriteLine("string类型赋值");
      
    4.     string str = "Init";
      
    5.     Console.WriteLine("原始:"+str);
      
    6.     Process(str);
      
    7.     Console.WriteLine("结果:"+str);
      
    8. }
      
    9. private  void Process(string str)
      
    10. {
      
    11.     str = "changed";
      
    12. }
      
    隐藏行号 复制代码 这是一段程序代码。
    1. public void PrintTheResultInt()
      
    2. {
      
    3.     Console.WriteLine("int类型赋值");
      
    4.     int i=0;
      
    5.     Console.WriteLine("原始:" + i);
      
    6.     Process(i);
      
    7.     Console.WriteLine("结果:" + i);
      
    8. }
      
    9. private void Process(int i)
      
    10. {
      
    11.     i = 2;
      
    12. }
      
    隐藏行号 复制代码 这是一段程序代码。
    1. public void PrintTheResultDateTime()
      
    2. {
      
    3.     Console.WriteLine("DateTime类型赋值");
      
    4.     DateTime dt = DateTime.Parse("2000-01-01");
      
    5.     Console.WriteLine("原始:" + dt.ToString("yyyy-MM-dd"));
      
    6.     Process(dt);
      
    7.     Console.WriteLine("结果:" + dt.ToString("yyyy-MM-dd"));
      
    8. }
      
    9. private void Process(DateTime dt)
      
    10. {
      
    11.     dt = DateTime.Parse("2001-01-01");
      
    12. }
      
    隐藏行号 复制代码 这是一段程序代码。
    1. public void PrintTheResultArrayList()
      
    2. {
      
    3.     Console.WriteLine("ArrayList类型赋值");
      
    4.     ArrayList arraylist = new ArrayList();
      
    5.     Console.WriteLine("原始:" + arraylist.Count);
      
    6.     Process(arraylist);
      
    7.     Console.WriteLine("结果:" + arraylist.Count);
      
    8. }
      
    9. private void Process(ArrayList  arraylist)
      
    10. {
      
    11.     arraylist.Add("1");
      
    12. }
      

    在以上四段程序,输出结果是什么呢?

    image

    可以看出来,除了ArrayList类型的赋值,值进行改变外,其它都是保持初始状态,难道string,int,DateTime都是值类型吗?

    使用方案1,你就不难发现,string是引用类型,他是值类型中的间谍。string 是引用类型,但它的使用与值类型的使用完全一样,是把它进行了仿值类型编造。

    Int 是基元类型,DateTime是结构体,他们两个的确是名副其实的值类型。

    行了,就这么多吧,下回我就说一说可空类型吧。

  • 相关阅读:
    flex>导航
    flex>图表控件
    Struts2>Cannot find the tag library descriptor for /strutstags
    jsp>Smartupload例子代码
    flex>MXML语法
    解决JBoss只能通过localhost(127.0.0.1)而不能通过IP访问
    jsp>tomcat配置虚拟目录
    JSF>概述
    Struts2>中文乱码
    flex>HttpService
  • 原文地址:https://www.cnblogs.com/taofh/p/1554510.html
Copyright © 2020-2023  润新知