2016-05-23 15 views
7

Mam właściwość, która jest obecnie automatyczna.Getter bez ciała, Setter z

public string MyProperty { get; set; } 

Jednak teraz trzeba go wykonać pewne działania za każdym razem, gdy zmienia się, więc chcę dodać logikę do seter. Więc chcę zrobić coś takiego:

public string MyProperty { 
    get; 
    set { PerformSomeAction(); } 
} 

Jednak to nie buduje ... MyProperty.get' must declare a body because it is not marked abstract, extern, or partial

nie mogę po prostu powrót getter MyProperty jako spowoduje to nieskończoną pętlę.

Czy jest sposób na zrobienie tego, czy też muszę zadeklarować zmienną prywatną, do której się odnosimy? Wolałbym nie jako MyProperty zostaje wykorzystany w kodzie zarówno w tej klasie i poza nim

Odpowiedz

8

Musisz użyć nieruchomość na polu Podłoże:

private string mMyProperty; 
public string MyProperty 
{ 
    get { return mMyProperty; } 
    set 
    { 
     mMyProperty = value; 
     PerformSomeAction(); 
    } 
} 
+2

To jest smutne, prawda. Chodzi mi o to, dlaczego dopuszczają coś takiego jak 'string myStr {get; prywatny zestaw; } 'but not' {get; ustaw {...}} '. – Parziphal

2

can not zaimplementować jeden bez drugiego , jak podczas korzystania z tego, odnosi się do (ukrytego) pola pomocniczego, które jest automatycznie generowane w przypadku autogenerowanej właściwości. Jednak po zaimplementowaniu jednego musisz ustawić to pole zaplecza na dwa sposoby.

auto-way to tylko skrót do tego:

private string _property; 
public string MyProperty 
{ 
    get { return _property; } 
    set { _property = value; } 
} 

Więc jeśli you'd pominąć pola ukrytego w jednej z metod (to co pobierające i ustawiające są faktycznie) W jaki sposób należy to metoda wiedzieć, jak przechowywać/uzyskać wartość?

0

Jeśli robisz coś w ustawiaczu, będziesz musiał jawnie zadeklarować zmienną. Na przykład.

private string _myProperty; 
public string MyProperty { 
    get { return _myProperty; }; 
    set 
    { 
     _myProperty = value; 
     PerformSomeAction(); 
    } 
} 

lub - w seter można przekazać wartość do funkcji i robić to, co chcesz go tam ... zakładając, że chcesz zmienić/sprawdzić wartość w funkcji PerformSomeAction()

1

Musisz albo dostarczają ciała zarówno dla gettera, jak i setera, albo żadnego z nich.

Jeśli więc zdefiniujesz jedno, nie jest to już właściwość automatyczna.

Więc trzeba zrobić:

Albo

public string MyProperty { 
    get; 
    set; 
}// Automatic property, no implementation 

LUB

public string MyProperty 
{ 
    get { return mMyProperty; } 
    set 
    { 
     mMyProperty = value; 
     PerformSomeAction(); 
    } 
} 
0

To jest podobne do pytania C# getter and setter shorthand.

Po ręcznym określeniu narzędzia ustawiającego nie będzie używał automatycznego mechanizmu właściwości dla programu pobierającego, dlatego komunikat o błędzie działa tak, jakby go brakowało. Będziesz musiał napisać własny getter, gdy określisz settera.

Powiązane problemy