这只是在C#中实例化对象的两种可接受的等效语法之一,使用对象初始化(如果只是
var cat = new Cat();
,则不能省略括号)。
- 因为您的类没有显式构造函数,所以提供了一个默认的无参数构造函数给Cat类。
new Cat {...}
允许初始化Cat对象的属性作为new Cat() {...}
的快捷方式来实例化,调用上述构造函数。
构造函数部分很重要。如果没有隐式默认构造函数/显式无参数构造函数,则不能省略括号,并且仍需在其中提供参数:
public class Cat {
public string Name;
public int Age;
public Cat(string s) {
Name = s;
}
}
void TestCat()
{
var goodCat = new Cat("Felix") { Age = 3 } ;
Console.WriteLine($"The cat {goodCat.Name} is {goodCat.Age} years old");
}
特殊情况:(常用于集合、列表、字典等)。
如果一个类T实现了IEnumerable(即有一个公共的GetEnumerator()函数),并且实现了Add方法,则对象初始化器将使用Add方法进行枚举时的集合操作。
示例来自https://blog.mariusschulz.com/2014/06/26/fun-with-custom-c-collection-initializers
创建一个特殊的类"Points",它行为类似于具有初始化功能的"List"。
请注意,这也使用了现有的无参数构造函数!
public class Points : IEnumerable<Point3D>
{
private readonly List<Point3D> _points;
public Points()
{
_points = new List<Point3D>();
}
public void Add(double x, double y, double z)
{
_points.Add(new Point3D(x, y, z));
}
public IEnumerator<Point3D> GetEnumerator()
{
return _points.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
使用方式:
var cube = new Points
{
{ -1, -1, -1 },
{ -1, -1, 1 },
{ -1, 1, -1 },
{ -1, 1, 1 },
{ 1, -1, -1 },
{ 1, -1, 1 },
{ 1, 1, -1 },
{ 1, 1, 1 }
};
()
的麻烦,但同时也会引起混淆和不必要的麻烦,还有一个新规则需要记住,即只有在类具有无参构造函数时才能使用这种语法糖。顺便说一句,在 C++ 中它有一个目的:零初始化与不确定值。 - mireazma