Nested object initializer syntax

后端 未结 1 441
慢半拍i
慢半拍i 2020-11-27 07:12

Resharper has just suggested the following refactoring to me:

// Constructor initializes InitializedProperty but
// the UninitializedSubproperty is uninitial         


        
相关标签:
1条回答
  • 2020-11-27 07:13

    This syntax is called Object Initialization. C# specification clearly gives a lot of examples on this subject:

    7.6.10.2 Object initializers

    An object initializer consists of a sequence of member initializers, enclosed by { and } tokens and separated by commas. Each member initializer must name an accessible field or property of the object being initialized, followed by an equals sign and an expression or an object initializer or collection initializer. It is an error for an object initializer to include more than one member initializer for the same field or property. It is not possible for the object initializer to refer to the newly created object it is initializing.

    Examples are:

    Rectangle r = new Rectangle
                {
                    P1 = { X = 0, Y = 1 },
                    P2 = { X = 2, Y = 3 }
                };
    

    Compiles down to:

    Rectangle r = new Rectangle();
    r.P1.X = 0;
    r.P1.Y = 1;
    r.P2.X = 2;
    r.P2.Y = 3;
    

    Having:

    public class Rectangle
    {
        public Rectangle()
        {
            P1 = new Point(); //default Point for demo purpose
            P2 = new Point(); //default Point for demo purpose
        }
    
        public Point P1 { get; set; }
        public Point P2 { get; set; }
    }
    

    and

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }
    

    Also consider reading a great chapter 8.3 Simplified initialization in C# in depth book. Jon Skeet provides another look at advantages of using this kind of syntax for initializing tree-like structures.

    0 讨论(0)
提交回复
热议问题