Vlastnosti soukromého seřizovač v jazyce C # 3.0 inicializace objektu

hlasů
11

Mám-li následující kód:

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

Soukromý kompilátor generované proměnná je vytvořen pro nahrávač. Chci seřizovač nemusí být přístupný pouze pro inicializaci objektu. Ale, jak se dostanu k počátečnímu nastavení myname proměnnou?

Čtení o inicializaci objektu jsem zjistil následující:

... to je jen pro čtení a vlastní pole představující základní úložiště má název kompilátoru generované, že nemůžeme použít v konstruktoru přiřadit k ní. Řešením je použití [...] objekt inicializátory

Řešením by bylo, pak použít:

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

Ale to končí chyba kompilátoru sayin, že:

Vlastnost nebo indexovací ‚MyClass.MyClass.myName‘ nemůže být použit v tomto kontextu, protože přístupový objekt set je nepřístupná

Ano, existuje způsob, jak dosáhnout nastavením této hodnoty pomocí inicializace objektu? Pokud ano, jaký je správný způsob, jak to udělat?

Položena 13/07/2009 v 21:30
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
12

No není tam žádný způsob, jak toho dosáhnout. Objektů Inicializátory Vám umožní přístup do pole a vlastnosti, které by byly jinak přístupné mimo inicializátor pouze.

Váš nejlepší možností je použít konstruktor, která výslovně stanoví tyto vlastnosti.

Odpovězeno 13/07/2009 v 21:32
zdroj uživatelem

hlasů
6

Private set na myname znamená, že můžete pouze inicializovat (set) je z něčeho, co je členem Moje_třída . Například:

        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;
        }
    }

(Zkopírovány I a vložit svůj kód inicializace do GetSampleObject metodou).

Ale pokud se pokusíte nastavit mimo Moje_třída , dostanete chyba kompilátoru, protože soukromé je soukromé.

Odpovězeno 13/07/2009 v 21:50
zdroj uživatelem

hlasů
5

V případě, že je třeba nastavit při inicializaci pak zváží jejich předáním jako args konstruktoru

Odpovězeno 13/07/2009 v 21:32
zdroj uživatelem

hlasů
1

Měl jsem tento požadavek int minulosti, tak i pro OR / M věci. To, co jsem v podstatě dělat, je použít nemovitost s Backer pole a zkontrolujte, zda již byla nastavena vlastnost. Pokud ano, vyvolá výjimku.

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;

A další možností pro zajištění kompatibility / m nebo která také využívá inicializace konstruktoru:

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; } 
}
Odpovězeno 13/07/2009 v 21:44
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more