2009-07-13 163 views
11

如果我有以下代码:私人-setter属性

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

私人编译器生成的变量的设定器创建的。我希望setter不能仅用于对象初始化。但是,我如何才能最初设置myName变量?

阅读有关对象的初始化我发现:

...它是只读的,代表 底层存储的 私人领域具有我们 不能在使用 编译器生成的名称构造函数将它分配给 。该解决方案是使用[...]对象 初始化

的解决办法是,那么,使用方法:

MyClass mc = new MyClass { 
myName = "What ever", 
myId = "1234" 
}; 

但这在说结束了在编译器错误:

属性或索引 “MyClass.MyClass.myName” 不能在此上下文中,因为 set访问是不可访问

那么,有没有一种方法可以实现使用对象初始化设置此值?如果有,那么做什么是正确的方法?

回答

6

私订意味着你只能从东西是一个初始化(套)它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; 
     } 
    } 

(我复制并粘贴您的初始化代码到GetSampleObject方法)。

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

12

不,没有办法做到这一点。对象初始化程序只允许您访问在初始化程序之外可访问的字段和属性。

你最好的选择是使用一个明确设置这些属性的构造函数。

+0

谢谢,我想告诉学生,如果使用3.0的新功能可以实现这一点,但看起来答案是否定的。现在我必须为这本书提交勘误表:P – jluna 2009-07-13 21:54:12

5

如果他们需要在初始化进行设置,然后考虑将它们作为参数传递给构造

+1

是的,为什么简单的事情变得复杂? – 2009-07-13 20:33:59

+0

因为如果你想在对象初始化的时候做一些事情,你可以在构造函数中做。在其他任何地方做它都没有意义。 – 2009-07-13 20:48:17

1

我已经INT过去的这个要求,以及对OR/M的东西。我基本上做的是使用一个真正的财产与支持者领域,并检查,看看是否已经设置属性。如果是这样,抛出一个异常。

public string myName 
{ 
    get{ return _myName; } 
    set 
    { 
     if(_myName != null && _myName != value) 
      throw new Exception("The myName property may only be set once."); 
     _myName = value; 
    } 
} 

private string _myName; 

而另一种选择OR/M的兼容性还需要构造函数初始化的优势:对MYNAME

public class MyClass 
{ 
    [Obsolete("For ORM use only!")] 
    [EditorBrowsableState(EditorBrowsableState.Never)] 
    public MyClass(){} 

    public MyClass(string name){ myName = name; } 

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