new 运算符 -
new 运算符创建类型的新实例。
new 关键字还可用作成员声明修饰符或泛型类型约束。
C# 语言参考记录了 C# 语言的最新发布版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。
本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。
小窍门
若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。
构造函数调用
若要创建新类型的实例,请使用new运算符调用该类型的构造函数之一:
var dict = new Dictionary<string, int>();
dict["first"] = 10;
dict["second"] = 20;
dict["third"] = 30;
Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30
可以使用带有 运算符的new实例化和初始化一个语句中的对象,如下例所示:
var dict = new Dictionary<string, int>
{
["first"] = 10,
["second"] = 20,
["third"] = 30
};
Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30
目标类型化 new
构造调用表达式由目标确定类型。 也就是说,如果已知表达式的目标类型,则可以省略类型名称,如下面的示例所示:
List<int> xs = new();
List<int> ys = new(capacity: 10_000);
List<int> zs = new() { Capacity = 20_000 };
Dictionary<int, List<int>> lookup = new()
{
[1] = new() { 1, 2, 3 },
[2] = new() { 5, 8, 3 },
[5] = new() { 1, 0, 4 }
};
如前面的示例所示,始终在目标类型 new 表达式中使用括号。
如果 new 表达式的目标类型未知(例如使用 var 关键字时),必须指定类型名称。
数组创建
还可以使用 new 运算符创建数组实例,如下例所示:
var numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
Console.WriteLine(string.Join(", ", numbers));
// Output:
// 10, 20, 30
使用数组初始化语法创建数组实例,并在一个语句中使用元素填充该实例。 以下示例显示可以执行该操作的各种方法:
var a = new int[3] { 10, 20, 30 };
var b = new int[] { 10, 20, 30 };
var c = new[] { 10, 20, 30 };
Console.WriteLine(c.GetType()); // output: System.Int32[]
有关数组的详细信息,请参阅数组。
匿名类型的实例化
要创建匿名类型的实例,请使用 new 运算符和对象初始值设定项语法:
var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!
类型实例的析构
无需销毁以前创建的类型实例。 系统会自动销毁引用和值类型的实例。 一旦销毁包含这些类型的上下文,系统就会销毁值类型的实例。 垃圾回收器会在删除上次引用类型后的某些未指定时间销毁引用类型的实例。
对于包含非托管资源(例如文件句柄)的类型实例,请采用确定性清理来确保资源尽快释放。 有关详细信息,请参阅 System.IDisposable API 参考和 using 语句一文。
运算符可重载性
用户定义的类型可以重载 new 运算符。
C# 语言规范
有关详细信息,请参阅 C# 语言规范的 new 运算符部分。
有关条件由目标确定类型的 new 表达式的详细信息,请参阅功能建议说明。