new在CSharp中不仅仅是关键字,其实它本质也是一个操作符。
new操作符:
1、帮助我们在内存中创建一个类型的实例,
2、并且立即调用这个类型的实例构造器instance constructor。
3、如果new操作符的左边有赋值符号的话,还可以得到实例的内存地址,并且把地址通过赋值符号交给负责访问这个实例的变量。
Form myForm = new Form();
new的第一个功能:在内存中创建一个类型的实例:new Form创建一个类型的实例;
new的第二个功能:立即调用这个类型呢的实例构造器:然后圆括号()是构造器。所以有new Form()。
new的第三个功能:得到实例的内存地址。并且把地址通过赋值符号交给负责访问这个实例的变量。便有了赋值的左边Form myForm = new Form();。这样在变量和实例之间就构成了引用关系。有了这个引用关系,就可以通过变量来访问实例。
myForm.Text = "Hello";
myForm.ShowDialog();
这一行代码看起来是:new操作符创建实例化对象,却将new的功能展现出来。
new操作符:
4、除了可以立即调用实例构造器以外,还可以调用实例的初始化器。初始化器就是在构造器之后的花括号。(){}。
{}即初始化器中可以立刻为实例的属性设置它的值:初始化属性值:不仅一个属性,还可以多个属性同时赋值。
Form myForm = new Form(){Text = "Hello", FormBorderStyle.SizableToolWindow};
有个问题:是不是只要我想在内存中创建类型的一个实例,就要用new?
答案:不一定。String也是类类型。
string name = "Tim"; // C#的语法糖一
微软为了提升使用基本类型时的体验:把这个基本类型string的new隐藏起来了。这样在用的时候就会像用int一样自然。
int x = 100;
string name = "Tim";
如果非得想去调用new的操作符。也可以呀。此时会发现他有8个重载。
string name = new string(); // 平时不会这么用。
new操作符:
5、为匿名类型创建对象。至于类型,编译器自动推断。
var person = new {Name="Mr.Okay", Age=34}; // 初始化对象。
var关键字:隐式类型,编译器自己去推断类型。
new操作符使用的时候有一定的危险性,不能到处去new。正在编写的类型和你将要创建的实例类型之间容易形成非常紧密的耦合。比如说:
class Program
{
static void Main(string[] args)
{
var myForm = new Form() { Text = "hello" };
var person = new { Name = "Mr.Okay", Age = 34 };
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(person.GetType().Name);
}
}
如果在Program中,将Form所在的类丢失,会导致整个Program无法运行。Program以紧耦合的方式,仅仅依托在了Form类上,如果Form类无法正常运行,那么Progrma类也over了。
使用new操作符时,一定要小心。容易造成紧耦合。
但是我们在编程中不可能不使用new,肯定会形成紧耦合。为此,有一种设计模式,专门用来解决这个问题:
依赖注入模式(Dependency injection)
把紧耦合,变成相对比较松的耦合。
总之:new操作符功能强大,不能乱用,在写大型程序时:为了避免new操作符造成的紧耦合,所以会使用,依赖注入的设计模式。
接下来谈谈new关键字:
不再是操作符了。
子类对父类方法的隐藏:第22行中的new变成了修饰符,修饰后面的方法。不再是操作符了。
class Program
{
static void Main(string[] args)
{
Student stu = new Student();
stu.Report();
CsStudent csStu = new CsStudent();
csStu.Report();
}
}
class Student
{
public void Report()
{
Console.WriteLine("I'm a Student");
}
}
class CsStudent:Student
{
new public void Report()
{
Console.WriteLine("I'm CS student.");
}
}