zoukankan      html  css  js  c++  java
  • 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是结构体,他们两个的确是名副其实的值类型。

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

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/taofh/p/1554510.html
Copyright © 2011-2022 走看看