ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# new 运算符(C# 参考) 用于创建对象和调用构造函数。例如: ``` Class1 obj = new Class1(); ``` 还可用于创建匿名类型的实例: ``` var query = from cust in customers select new {Name = cust.Name, Address = cust.PrimaryAddress}; ``` **new** 运算符还用于调用值类型的默认构造函数。例如: ``` int i = new int(); ``` 在上一个语句中,i 初始化为 0,它是 **int** 类型的默认值。该语句的效果等同于: ``` int i = 0; ``` 有关默认值的完整列表,请参见[默认值表(C# 参考)](https://msdn.microsoft.com/zh-cn/library/83fhsxwc.aspx)。 请记住,为[结构](https://msdn.microsoft.com/zh-cn/library/ah19swz4.aspx)声明默认的构造函数是错误的,因为每一个值类型都隐式具有一个公共的默认构造函数。可以在结构类型上声明参数化构造函数以设置其初始值,但是,只有在需要默认值之外的值时才必须这样做。 值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。两种类型的对象都是自动销毁的,但是,基于值类型的对象是在超出范围时销毁,而基于引用类型的对象则是在对该对象的最后一个引用被移除之后在某个不确定的时间销毁。对于占用固定资源(例如大量内存、文件句柄或网络连接)的引用类型,有时需要使用确定性终止以确保对象被尽快销毁。有关更多信息,请参见 [using 语句(C# 参考)](https://msdn.microsoft.com/zh-cn/library/yh598w02.aspx)。 不能重载 **new** 运算符。 如果 **new** 运算符分配内存失败,将引发异常 [OutOfMemoryException](https://msdn.microsoft.com/zh-cn/library/system.outofmemoryexception.aspx)。 在下面的示例中,通过使用 **new** 运算符创建并初始化一个 **struct** 对象和一个类对象,然后为它们赋值。显示了默认值和所赋的值。 ``` struct SampleStruct { public int x; public int y; public SampleStruct(int x, int y) { this.x = x; this.y = y; } } class SampleClass { public string name; public int id; public SampleClass() {} public SampleClass(int id, string name) { this.id = id; this.name = name; } } class ProgramClass { static void Main() { // Create objects using default constructors: SampleStruct Location1 = new SampleStruct(); SampleClass Employee1 = new SampleClass(); // Display values: Console.WriteLine("Default values:"); Console.WriteLine(" Struct members: {0}, {1}", Location1.x, Location1.y); Console.WriteLine(" Class members: {0}, {1}", Employee1.name, Employee1.id); // Create objects using parameterized constructors: SampleStruct Location2 = new SampleStruct(10, 20); SampleClass Employee2 = new SampleClass(1234, "Cristina Potra"); // Display values: Console.WriteLine("Assigned values:"); Console.WriteLine(" Struct members: {0}, {1}", Location2.x, Location2.y); Console.WriteLine(" Class members: {0}, {1}", Employee2.name, Employee2.id); } } /* Output: Default values: Struct members: 0, 0 Class members: , 0 Assigned values: Struct members: 10, 20 Class members: Cristina Potra, 1234 */ ``` 注意,在示例中字符串的默认值为 **null**,因此未显示它。 ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-cn/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 参考](https://msdn.microsoft.com/zh-cn/library/618ayhy6.aspx) [C# 编程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [C# 关键字](https://msdn.microsoft.com/zh-cn/library/x53a06bb.aspx) [运算符关键字(C# 参考)](https://msdn.microsoft.com/zh-cn/library/bewds7kc.aspx) [new(C# 参考)](https://msdn.microsoft.com/zh-cn/library/51y09td4.aspx) [匿名类型(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/bb397696.aspx)