New 操作符
不仅是个关键字,也是操作符,用于创建实例,是实例构造器的操作符。
1)new 可以创建一个类型的实例,并且立即调用这个实例的实例构造器 ( );
2)new 还能调用实例的初始化器 { },在初始化器中为实例赋值
初始化器中,可以初始化多个属性。
new和“.” 都是操作符,不是赋值,从左到右执行。因为没有引用变量引用它,很快就会被内存垃圾收集器收回。在后面也无法再去访问这个实例,所以只用于一次性的操作。使用实例初始化器,才可以再次调用。
3)new 可以为匿名类型创建对象
int 显式类型的变量,显示了变量的类型
var person = new { Name = "Kim", Age = 34 };
var 声明隐式类型的变量,变量类型不知,赋值时由编译器决定。
自动推断难以定义的类型,想写都写不出来, 如person,才能显示var的强大功能。
e.g. var x = 100;
var person = new {Name = "Kim", Age = 34};
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.GetType().Name);
<>f__AnonymousType 是约定的前缀
0 指在程序中创建的第一个
`2 指这个类型是一个泛型类,需要两个类型来构成它(能猜出来,这个例子中是 string,int)
4)使用new操作符,有一定的危险性,一旦在类里调用new操作符,创建了一个实例,那么正在编写的这个类型,就和创建实例的类型,之间就构成了非常紧密的耦合。
如:在Program类中,用new创建了Form类型的实例 Form()。此时,Program类和Form类,就紧紧的耦合在一起。如果在系统中,把Form类移除掉,Program类就会彻底无法运行。换言之,Program类,以紧耦合的方式,依赖在了Form类上。
依赖注入(Dependency Injection,简称DI)设计模式,就是把紧耦合,变成相对比较松的耦合。
new关键字的多用性
class Student
{
public string Name;
public int Score;
public void Report()
{
Console.WriteLine("A Student");
}
}
class CsStudent : Student
{
}
Student student = new Student();
student.Report();
CsStudent csStu = new CsStudent();
csStu.Report(); //会打印出两个“A Student”,因为CsStudent继承了Student
如果:
class CsStudent : Student
{
new public void Report() //new是修饰符
{
Console.WriteLine("A CS Student");
}
}
打印出
A Student
A CS Student
-> 指针访问对象成员操作符(以后再补)
直接操作内存,要注意上下文安全
sizeof (以后再补)
默认情况下只能获取基本数据类型的内存字节数,除了string 和 object 的那些关键字数据类型。因为默认情况下,sizeof只能获取 结构体类型 的数据在内存中所占的字节数,而 string 和 object 不是结构体。
在非默认情况下,sizeof 可以获取 非结构体类型 的数据在内存中所占的字节数,但是要注意上下文的安全性。
checked 和 unchecked (以后再补)
checked:检查有没有数值溢出
输出2进制结果,32个1
由于内存溢出,所以输出值会变为0. (二进制32个1+1,进位后溢出,就是0)
检验溢出
unchecked:不用检查有没有数值溢出
一元操作符
只要有一个操作数跟在操作符后面,就可以形成表达式。
1)