1.byte,int等等,这些简单类型实际上是BCL基类库类型的别名。
2.所有值类型都隐式地继承自System.ValueType类型(System.ValueType本身是一个类类型)。之所以说是“隐式地”,是因为在C#代码中,是看不见这个继承关系的,这个关系只有通过MSIL代码才可以看到,System.ValueType类型和所有的引用类型都继承自System.Object基类,
备注: 在C#多态中,不支持多重继承的,
类型 | 继承 | 再继承 |
int,struct,enum… | System.ValueType | System.Object |
引用类型 | 可以继承其他类 | System.Object |
由于不存在多重继承,那么值类型(结构等等)本身就继承了System.ssValueType,就不能继承其他类。
3.值类型与引用类型在 线程堆栈(栈是一种后进先出的数据结构)以及堆(堆是用于为引用类型的实例(对象)分配空间的内存区域,在堆上创建一个对象,会将对象地址传给栈上的变量,反过来叫变量指向对象,或者变量引用此对象) 的存放
值类型(变量本身包含了值类型的全部字段),会分配在线程堆栈上;注意一个细节:只有对变量进行操作,才会进行入栈;
4. .NET的一个约束:所有的元素使用前都必须初始化。
//Demo1 int i; Console.WriteLine(i);
//Demo2 public class Person { int ID{get;set;} string Name{get;set;} List<Book> Books {get;set;} //定义某个集合作为属性 }
Demo1:error 使用未赋值的变量
Demo2: 在多次使用Person类中,vs会经常提示警告:会出现“NullReferenceException异常”,当然这个异常也分使用场景,但非常希望,你能在Person类的构造函数中,实例化Books,this.Books = new List<Book>();这是个好习惯。
5.结构类型 struct
//定义 public struct ValPoint { public int x; public void Blank() } //调用 ValPoint vPoint1; vPoint1.Blank(); Console.WriteLine(vPoint);
在调用中报错,“使用了未赋值的局部变量”,int x,没赋值。
假设:
//定义 3 个局部变量 public struct ValPoint { public int x; public int y; public int z; public void Blank() }
那么,我们必须初始化 x,y,z 。还是那个原则:.NET的所有元素,都必须先初始化。
解决这个问题可以通过这样一种方式:编译器隐式地位结构类型创建无参数的构造函数。这个构造函数中会对结构成员进行初始化;所有值类型成员被赋予0或者相当于0的值,所有引用类型被赋予null值;
//调用 ValPoint vPoint1 = new ValPoint()
new的作用? 实例化?分配内存? 不是,注意:结构struct 变量本身就代表一个实例。 这里仅仅调用当前结构的默认构造函数,初始化结构变量中的所有字段。
//直接调用 Console.WriteLine((new ValPoint).x);
.x 前面是个对象,这里会创建一个临时变量,没有名称,然后再使用结构的默认构造函数对临时变量进行初始化。