• 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

  • 相关阅读:
    Eclipse/MyEclipse 选择Android NDK目录时提示“Not a valid NDK directory”
    Eclipse更改颜色主题
    Android模拟器访问本机服务器
    DIV水平垂直居中的CSS兼容写法
    Python3中使用PyMySQL连接Mysql
    Windows7 IE11 F12控制台DOC资源管理器报错的问题解决方法
    Windows 7无法卸载及安装IE11的解决方法
    查看端口占用
    VS2010/VS2013中ashx代码折叠的问题
    手机页面关于头部固定定位与input出现的问题
  • 原文地址:https://www.cnblogs.com/huage-1234/p/7364769.html
Copyright © 2020-2023  润新知