在 C# 中实例化 class 时使用 () 或 {}

Using () or {} when instantiating class in C#

x1和x2的初始化有什么不同吗?

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var x1 = new C { };

            var x2 = new C ();

        }
    }

    public class C
    {
        public int A; 
    }
}

不,它们编译成相同的代码

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       14 (0xe)
  .maxstack  1
  .locals init ([0] class ConsoleApplication2.C x1,
           [1] class ConsoleApplication2.C x2)
  IL_0000:  nop
  IL_0001:  newobj     instance void ConsoleApplication2.C::.ctor()
  IL_0006:  stloc.0
  IL_0007:  newobj     instance void ConsoleApplication2.C::.ctor()
  IL_000c:  stloc.1
  IL_000d:  ret
} // end of method Program::Main

然而,x2 是处理无参数构造函数且不使用对象初始值设定项初始化任何值时的标准编码风格。

大括号{}用于对象或集合初始化:

new C() { Property1 = "Value", Property2 = "etc..." };

需要注意的是这里的()可以省略,因为它是默认的构造函数。因此,new C{} 基本上是 new C() {}.

在您的示例中,没有区别。两者都调用默认构造函数并且不传递任何值。 { } 是对象初始值设定项符号,它允许您在未通过构造函数传入的 public 属性上设置值。

例如。如下class,PropertyA通过构造函数传入,PropertyA,PropertyB,PropertyC可在对象上设置。

class TestClass
{
    public string PropertyA { get; set; }
    public string PropertyB { get; set; }
    public string PropertyC { get; set; }

    public TestClass(string propertyA)
    {
        propertyA = propertyA;
    }
}

如果您需要设置所有值,您可以这样做

var test1 = new TestClass("A");
test1.PropertyB = "B";
test1.PropertyC = "C";

或者使用对象初始化器格式的等价物是

var test2 = new TestClass("A") {PropertyB = "B", PropertyC = "C"};