支付宝
微信
扫描二维码打赏
更多详情(暂无)

C#中的值类型、引用类型,代码告诉你他是什么类型。

C#代码告诉你这是什么类型。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 值类型引用类型
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Func<object, string> fnGetType = delegate (object obj)//委托类型
14             {
15                 var result = "";
16                 if (obj != null)
17                 {
18                     var aa = obj.GetType();
19                     if (aa.IsValueType) result = aa.Name + "该类型是值类型";//是否是值类型,false则为引用类型
20                     else result = aa.Name + "该类型是引用类型";
21                 }
22                 return result;
23             };
24             Func<object, string> fnGetType1 = (object obj) =>//既然是委托类型,也同样可以与匿名函数、或者采用Lambda表达式结合使用
25             {
26                 var result = "";
27                 if (obj != null)
28                 {
29                     var aa = obj.GetType();
30                     if (aa.IsValueType) result = aa.Name + "该类型是值类型";//是否是值类型,false则为引用类型
31                     else result = aa.Name + "该类型是引用类型";
32                 }
33                 return result;
34             };
35 
36             int a = 1;
37             string b = "1";
38             char c = '/';
39             long d = 123;
40             decimal e = 2.00m;
41             byte f = 1;
42             var g = new Program();
43             var h = new Student();
44             Console.WriteLine(fnGetType(a));
45             Console.WriteLine(fnGetType1(b));
46             Console.WriteLine(fnGetType(c));
47             Console.WriteLine(fnGetType1(d));
48             Console.WriteLine(fnGetType(e));
49             Console.WriteLine(fnGetType(f));
50             Console.WriteLine(fnGetType1(g));
51             Console.WriteLine(fnGetType(h));
52             Console.ReadKey();
53         }
54     }
55     public class Student
56     {
57         public Student() { }
58         public Student(string name, string sex, int age)
59         {
60             Name = name;
61             Sex = sex;
62             Age = age;
63         }
64         public string Name { get; }
65         public string Sex { get; }
66         public int? Age { get; }//值类型才能为空
67     }
68 }

控制台运行结果如下图:

总结一下:

值类型和引用类型的区别
所有继承System.Value的类型都是值类型,其他类型都是引用类型。

引用类型可以派生出新的类型,而值类型不能;
引用类型存储在堆中,而值类型既可以存储在堆中也可以存储在栈中。
引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);
引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
当比较两个值类型时,进行的是内容比较;而比较两个引用类型时,进行的是引用比较。
值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
Int[]是引用类型还是值类型
数组类型是一族类型,它们都继承System.Array,而System.Array继承自System.Object。所以所有的数组类型都是引用类型

具体详细,可以见博客园 http://www.cnblogs.com/jiajiayuan/archive/2011/09/23/2185966.html

posted @ 2017-08-15 14:06  华临天下  阅读(180)  评论(0编辑  收藏  举报