简体   繁体   English

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

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

Is there any difference in the initialization for x1 and x2? 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; 
    }
}

In your example, there's no difference. 在您的示例中,没有区别。 Both are calling the default constructor and not passing in any values. 两者都在调用默认构造函数,并且未传入任何值。 The { } is the object initializer notation which allows you to set values on public properties that aren't passed in through the constructor. {}是对象初始值设定项表示法,它允许您在未通过构造函数传递的公共属性上设置值。

Ex. 例如 With the following class, PropertyA is passed in through the constructor and PropertyA, PropertyB, PropertyC are settable on the object. 对于以下类,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;
    }
}

If you needed set all values you could do this 如果需要设置所有值,则可以执行此操作

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

Or the equivalent using the object initializer format would be 否则使用对象初始值设定项格式的等效项将是

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

No, they compile to the same code 不,它们编译为相同的代码

.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

however x2 is the standard coding style when dealing with a parameterless constructor and not initializing any values using the object initializer. 但是, x2是处理无参数构造函数且未使用对象初始化程序初始化任何值时的标准编码样式。

The curly bracket {} is used for object or collection initialization: 大括号{}用于对象或集合的初始化:

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

It should be noted that here the () can be omitted, as it is the default constructor. 应该注意的是,这里的()可以省略,因为它是默认的构造函数。 Therefore, new C{} is basically new C() {} . 因此, new C{}基本上是new C() {}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM