代码之家  ›  专栏  ›  技术社区  ›  Pete

对象初始值设定项和构造函数之间有什么区别?

  •  152
  • Pete  · 技术社区  · 17 年前

    这两者之间有什么区别?什么时候在“构造函数”上使用“对象初始值设定项”,反之亦然?我和C#一起工作,如果这很重要的话。另外,对象初始值设定项方法是否特定于C#或.NET?

    5 回复  |  直到 13 年前
        1
  •  251
  •   Community Mohan Dere    9 年前

    对象初始值设定项是在C#3中添加的,目的是在使用对象时简化对象的构造。

    构造函数在给定0个或多个参数的情况下运行,用于创建和初始化对象 之前

    MyObject myObjectInstance = new MyObject(param1, param2);
    

    在本例中,的构造函数 MyObject param1 和 param2 肌体 在记忆中。返回创建的对象(使用这些参数设置)并将其设置为 myObjectInstance .

    通常,让构造函数需要所需的参数才能完全设置对象被认为是一种良好的做法,这样就不可能在无效状态下创建对象。

    但是,通常可以设置但不是必需的“额外”属性。这可以通过重载构造函数来处理,但会导致大量构造函数在大多数情况下不一定有用。

    这将导致对象初始值设定项-对象初始值设定项允许您在对象上设置属性或字段 之后 它已经建造好了,但是 之前 你可以把它用在其他任何东西上。例如:

    MyObject myObjectInstance = new MyObject(param1, param2)
    {
        MyProperty = someUsefulValue
    };
    

    这与执行以下操作时的行为大致相同:

    MyObject myObjectInstance = new MyObject(param1, param2);
    myObjectInstance.MyProperty = someUsefulValue;
    

    然而,在 环境对象初始值设定项的原子性可能是有益的,因为它可以防止对象处于未完全初始化的状态(请参阅 this answer 如需了解更多详细信息),它要么为null,要么按预期进行初始化。

        2
  •  51
  •   JaredPar    17 年前

    构造函数是在类型上定义的方法,它接受指定数量的参数,并用于创建和初始化对象。

    对象初始值设定项是在构造函数之后在对象上运行的代码,可用于将对象上任意数量的字段简洁地设置为指定值。这些字段的设置将发生 之后

        3
  •  34
  •   Community Mohan Dere    9 年前

    当你这样做的时候

    Person p = new Person { Name = "a", Age = 23 };
    

    这就是对象初始值设定项的基本功能:

    Person tmp = new Person(); //creates temp object calling default constructor
    tmp.Name = "a";
    tmp.Age = 23;
    p = tmp;
    

    this . 了解对象初始值设定项如何工作很重要。

        4
  •  16
  •   marc_s MisterSmith    17 年前

    在这种情况下,如果不指定这些必需属性,就无法创建对象。对象初始值设定项不能强制执行类似的操作。

    对象初始值设定项实际上只是缩短初始赋值的“语法便利”。不错,但在功能上不是很相关。

        5
  •  4
  •   em70    17 年前

    构造函数是(可能)接受参数并返回类的新实例的方法。它可能包含初始化逻辑。

    
    public class Foo
    {
        private SomeClass s;
        public Foo(string s)
        {
           s = new SomeClass(s);
        }
    }
    

    现在考虑下面的例子:

    
    public class Foo
    {
        public SomeClass s { get; set; }
        public Foo() {}
    }
    

    使用对象初始值设定项可以获得与第一个示例相同的结果,假设您可以使用以下代码访问SomeClass:

    
    new Foo() { s = new SomeClass(someString) }
    

    不过,请注意,对象初始值设定项只是语法上的糖分,编译后与赋值序列并没有什么区别。

        6
  •  0
  •   Sharunas Bielskis    6 年前

    对象初始值设定项在LINQ查询表达式中特别有用。查询表达式经常使用匿名类型,只有使用对象初始值设定项才能初始化匿名类型,如下面的代码示例所示:`

    var orderLineReceiver = new { ReceiverName = "Name Surname", ReceiverAddress = "Some address" };
    

    Object and collection initializers

        7
  •  0
  •   Sharunas Bielskis    6 年前

        class Program
        {
            static void Main(string[] args)
            {
                List<OrderLine> ordersLines = new List<OrderLine>()
                {
                    new OrderLine {Platform = "AmazonUK", OrderId = "200-2255555-3000012", ItemTitle = "Test product 1"},
                    new OrderLine {Platform = "AmazonUK", OrderId = "200-2255555-3000013", ItemTitle = "Test product 2"},
                    new OrderLine {Platform  = "AmazonUK", OrderId = "200-2255555-3000013", ItemTitle = "Test product 3"}
                };
            }
        }
        class OrderLine
        {
            public string Platform { get; set; }
            public string OrderId { get; set; }
            public string ItemTitle { get; set; }
        }
    

    public OrderLine(string platform, string orderId, string itemTitle)
    {
       Platform = platform;
       OrderId = orderId;
       ItemTitle = itemTitle;
    }
    

    编译器将显示错误-没有给出与所需形式参数对应的参数。可以通过在OrderLine类中包含不带参数的显式默认构造函数来修复它:

    public OrderLine() {}