C# 通用类型系统

参考文章:

 https://www.cnblogs.com/bakuhert/articles/5878086.html

http://www.cnblogs.com/anytao/archive/2007/05/11/must_net_07.html

.NET技术可以以规范和实现两部分来划分:
规范:公共语言架构(CLI):通用类型系统(CTS),公共语言规范( CLS),通用中间语言( CIL)
实现:.NET Framwork:公共语言运行时(CLR),.NET框架类库(FCL)

通用类型系统(CTS)
C#的基本数据类型都以与平台无关的方式来定义。C#的预定义类型并没有内置于语言中,而是内置于.NET Framework中。所有面向.NET的语言都最终被编译为IL。
例如,在C#中声明一个int变量时,声明的实际上是CTS中System.Int32的一个实例。这具有重要的意义:
确保IL上的强制类型安全;
实现了不同.NET语言的互操作性;
所有的数据类型都是对象。它们可以有方法,属性,等。例如:ToString()。

1,值类型

每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
int i = new int();等价于:Int32 i = new Int32();等价于:int i = 0;等价于:Int32 i = 0;
可以用Type.IsValueType属性来判断一个类型是否为值类型,GetType().IsValueType。
System.ValueType本身是一个类类型,而不是值类型。其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。
C#的所有值类型均隐式派生自System.ValueType:struct(直接派生于System.ValueType),short(System.Int16),int(System.Int32),char(System.Char),float(System.Single),bool(System.Boolean的别名),enum(派生于System.Enum)可空类型(派生于System.Nullable<T>泛型结构体)。

2,引用类型
几乎所有的引用类型都直接从System.Object继承。比如:class(派生于System.Object),数组(派生于System.Array),interface(接口不是一个“东西”,所以不存在派生于何处的问题。接口只是表示一种约定[contract]),delegate(派生于System.Delegate),string(System.String的别名),object(System.Object的别名),
string看起来像值类型。比如s1 = "b"操作,实际上,这是运算符重载的结果,当s1被改变时,.NET在托管堆上为s1重新分配了内存。这样的目的,是为了将做为引用类型的string实现为通常语义下的字符串。

值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;
引用类型支持多态,适合用于定义应用程序的行为。
引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的;

猜你喜欢

转载自blog.csdn.net/tran119/article/details/81390999
今日推荐