2010-06-30 12 views
5

Przeczytałem, że istnieją dobre powody, aby używać właściwości zamiast pól w C# na SO. Więc teraz chcę przekonwertować mój kod z użycia pól do używania właściwości.Czy istnieje elegancki sposób ustawić wartość domyślną dla właściwości w języku C#?

Dla pola instancji klasy mogę ustawić wartość domyślną. Na przykład:

int speed = 100; 

za równowartość nieruchomości, która moim zdaniem jest:

int Speed { get; set; } 

Moje zrozumienie jest, że nieruchomość zostanie zainicjowane prędkości do zera, gdy klasa jest tworzony. Nie byłem w stanie dowiedzieć się, jak ustawić domyślną wartość, aby łatwo zaktualizować mój kod. Czy istnieje elegancki sposób na zapewnienie domyślnej wartości nieruchomości?

Wygląda na to, że powinien być elegancki sposób na to, bez użycia konstruktora, ale po prostu nie mogę dowiedzieć się, jak.

+0

Co z użyciem konstruktora? Lub użyć właściwości z ręcznie zdefiniowanym polem podkładu zamiast autopoznalności? –

+0

Ułatwiłoby to moje zadanie konwersji, jeśli mogę zmienić pole na właściwość w tym samym miejscu, w którym pole zostało wcześniej zadeklarowane. Używając konstruktora musiałbym przewinąć mój kod, aby dokonać zmiany. Nie zdawałem sobie sprawy, że można użyć pola zaplecza, które zostało zainicjalizowane. –

+0

Nowości w C# 6: [Inicjatory dla właściwości auto] (https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#auto-property-enhancements) –

Odpowiedz

7

Najprościej jest zrobić normalne właściwość pola oparciem staroświecki, jak:

private int _speed = 100; 
public int Speed { get { return _speed; } set { _speed = value; } } 
+0

Dzięki dla kodu. To jest dość eleganckie i nie muszę używać konstruktora. Znakomity. –

+0

Brak prob. To właśnie zobaczysz cały czas dla kodu napisanego przed .NET 3.0. W wersji 3.0 wprowadzono auto-właściwość, ale napotkano dokładnie problem, który zgłosili Państwo, gdy nie można w prosty sposób zdefiniować wartości domyślnej bez korzystania z konstruktora. –

+0

Nadal podoba mi się stary sposób na tworzenie właściwości, jednak może to powodować zamieszanie, ponieważ nie wiesz, w jaki sposób uzyskać/ustawić wartość z wnętrza klasy. Czy używasz zmiennej instancji, czy używasz tej właściwości? –

1

należy ustawić domyślną wartość właściwości w konstruktorze. Nie ma innego sposobu, aby to zrobić dla właściwości automatycznych, ponieważ pola dla automatycznych rekwizytów są deklarowane w czasie kompilacji i zastępowane przez getter/setter. Jednak w jawnych właściwościach można zainicjować pole używane przez usługę do odczytu lub zapisu, o czym wspomniał Joe w swojej odpowiedzi.

0

konstruktora jest jedynym sposobem, aby ustawić wartość początkową własności auto.

1

CciSharp obsługuje DefaultValue attribute, który umożliwia umieszczanie wartości domyślnych na właściwościach automatycznych. To, czy CciSharp kwalifikuje się jako "eleganckie" rozwiązanie, jest jednak kwestią opinii (działa jak post-kompilator, który edytuje IL w pliku binarnym).

2

Wzór projektu, którego używam, który jest używany w formantach Windows.Forms firmy Microsoft i innych klasach .NET. Ponadto, z mojego zrozumienia, inicjalizacja poza contructor pozwala kompilatorowi just-in-time na optymalizację kodu klasy.

public class Foo { 
    public static const int DefaultSpeed = 100; 
    private int _speed = DefaultSpeed; 
    [DefaultValue(DefaultSpeed)] 
    public int Speed { get { return _speed; } set { _speed = value; } } 
} 

public class Foo { 
     public static Color DefaultForecolor { get {return SystemColors.WindowText; }} 
     private Color _forecolor = DefaultForecolor; 
     [DefaultValue(DefaultForeColor)] 
     public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } } 
    } 
Powiązane problemy