现在的位置: 首页 > 综合 > 正文

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

2012年10月30日 ⁄ 综合 ⁄ 共 2018字 ⁄ 字号 评论关闭

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

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

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

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

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

方案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. 
    
  13. }
    

 

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

image

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

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

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

 

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

抱歉!评论已关闭.