C#基础(1)

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  前面是个对象,这里会创建一个临时变量,没有名称,然后再使用结构的默认构造函数对临时变量进行初始化。

原文地址:https://www.cnblogs.com/zychengzhiit1/p/4811978.html