C#3.0对象初始化中的私有setter属性

jlu*_*una 11 .net initialization object c#-3.0

如果我有以下代码:

public class MyClass 
{ 
  public string myName { get; private set; } 
  public string myId { get; set; } 
} 
Run Code Online (Sandbox Code Playgroud)

为setter创建一个私有编译器生成的变量.我希望只有对象初始化才能访问setter.但是,如何初始设置myName变量?

阅读对象初始化我发现以下内容:

...它是只读的,表示底层存储的私有字段有一个编译器生成的名称,我们不能在构造函数中使用它来分配它.解决方案是使用对象初始化器

那么,解决方案是使用:

MyClass mc = new MyClass { 
myName = "What ever", 
myId = "1234" 
};
Run Code Online (Sandbox Code Playgroud)

但这最终会导致编译器错误:

属性或索引器'MyClass.MyClass.myName'不能在此上下文中使用,因为set访问器不可访问

那么,有没有办法使用对象初始化来设置此值?如果有,做正确的方法是什么?

Jar*_*Par 14

没有办法实现这一目标.对象初始化程序仅允许您访问在初始化程序之外可以访问的字段和属性.

您最好的选择是使用显式设置这些属性的构造函数.


azh*_*lov 6

myName上的私有设置意味着您只能从作为MyClass成员的内容初始化(设置)它.例如:

        public class MyClass {
        public string myName { get; private set; }
        public string myId { get; set; }

        public static MyClass GetSampleObject() {
            MyClass mc = new MyClass
            {
                myName = "Whatever",
                myId = "1234"
            };
            return mc;
        }
    }
Run Code Online (Sandbox Code Playgroud)

(我将初始化代码复制并粘贴到GetSampleObject方法中).

但是,如果您尝试将其设置在MyClass之外,则会出现编译器错误,因为私有是私有的.


Dav*_*her 5

如果需要将它们设置为初始化,则考虑将它们作为args传递给构造函数