2013-09-02 16 views
15

Mam pytanie. Ostatnio złapałem się używając 3 różnych linii kodu, które po bliższej inspekcji wyglądają i czują się tak samo.jaka jest różnica między const, readonly a statyczną klasą

public static class constant 
{ 
    public static readonly int val1 = 5; 
    public const int val2 = 5; 
    public static int val3 { get { return 5; } } 
} 

Moje pytanie brzmi, czy są one takie same i czy należy je stosować nad innym? w takim razie. Gdy?

także jako dodatkowe pytanie w visual studio, dlaczego wszystkie one są reprezentowane inaczej w intellisense?

enter image description here

Odpowiedz

6

Element zadeklarowany jako readonly daje możliwość zmiany w (statycznym) konstruktorze klasy, podczas gdy element const nie może zostać zmieniony w czasie wykonywania.

Stwierdzenie pole jako const powoduje automatycznie statyczne cytuje §10.3.7:

Gdy pole, sposób, własności zdarzenie operator lub konstruktora zgłoszenie zawiera statyczny modyfikator deklaruje statyczny członek. Ponadto deklaracja stała lub typu jawnie deklaruje element statyczny o wartości .

Trzeci jest tylko właściwością tylko do odczytu, co dzieje się zawsze powrócić 5.

Nigdy nie należy używać taką właściwość i wolą członków const gdzie to możliwe, w celu umożliwienia kompilator i/lub drgania aby dokonać optymalizacji i pomóc innym osobom odczytać twój kod (ta własność jest dla mnie czymś w rodzaju WTF). Statyczny element tylko do odczytu musi być użyty, jeśli wymagana jest stała wartość zainicjowana podczas uruchamiania programu (jak na przykład liczba rdzeni maszyny).

Jest to doskonały przykład ze specyfikacją # C (§10.5.2.1)

statycznego pola tylko do odczytu, jest przydatny, gdy pożądane jest symboliczną nazwą stałej wartości , ale gdy typ wartość nie jest dozwolona w deklaracji const lub gdy nie można obliczyć wartości na podczas kompilacji.W przykładzie

public class Color 
{ 
    public static readonly Color Black = new Color(0, 0, 0); 
    public static readonly Color White = new Color(255, 255, 255); 
    public static readonly Color Red = new Color(255, 0, 0); 
    public static readonly Color Green = new Color(0, 255, 0); 
    public static readonly Color Blue = new Color(0, 0, 255); 
    private byte red, green, blue; 
    public Color(byte r, byte g, byte b) { 
     red = r; 
     green = g; 
     blue = b; 
    } 
} 

Czarny, biały, czerwony, zielony i niebieski członkowie nie mogą być zadeklarowane jako const członków, ponieważ ich wartości nie mogą być obliczane w czasie kompilacji. Jednak deklarowanie ich jako statycznych tylko do odczytu ma ten sam efekt .

I jeszcze jedna różnica (§10.5.2.2):

Stałe i pola readonly mają różne wersjonowania binarny semantykę. Gdy wyrażenie odwołuje się do stałej, wartość stałej jest uzyskiwana podczas kompilacji, ale gdy wyrażenie odwołuje się do pola tylko do odczytu, wartość pola nie jest uzyskiwana do czasu wykonania .

Podsumowując, są bardzo różne, nawet jeśli na pierwszy rzut oka mogą wyglądać podobnie i powinieneś użyć tego, który najlepiej pasuje do twojego zamiaru.

0

statyczne tylko do odczytu, mogą być przypisane na constroctor natomiast const nie. Ponadto getter nie musi zwracać stałej wartości, wartość van może być elementem prywatnym, który można zmienić w innej części klasy lub być wartością obliczoną.

Od readonly (C# Reference)

tylko do odczytu słów kluczowych różni się od słowa kluczowego const. Pole stałej można zainicjować tylko na deklaracji pola. Pole tylko do odczytu można zainicjować na deklaracji lub w konstruktorze . Dlatego też pola readonly mogą mieć różne wartości w zależności od użytego konstruktora. Ponadto, podczas gdy pole const jest kompilacji stałe pole tylko do odczytu mogą być wykorzystywane do wykonywania stałe, jak w poniższym przykładzie:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks; 

tylko do odczytu słowo kluczowe jest modyfikator, które można używaj na polach. Gdy deklaracja pola zawiera modyfikator tylko do odczytu, przypisania do pól wprowadzone przez deklarację mogą wystąpić tylko jako część deklaracji lub w konstruktorze w tej samej klasie.

Od const (C# Reference)

słowa kluczowego const służy do modyfikowania deklarację pola lub zmiennej lokalnej . Określa, że ​​wartość pola lub lokalnej zmiennej jest stała, co oznacza, że ​​nie można jej zmodyfikować.

Ponadto, są różne w intellisense jak są one różne czas kompilacji obiektów

+1

To nie odpowiada na pytanie. – AgentFire

0

Należy użyć const pola mrówek, kiedy tylko możesz - ale to działa tylko dla typów pierwotnych.

Gdy potrzebujesz niestandardowego typu (np. Własnej klasy lub struktury), powinieneś użyć public static property.

Pola publiczne są używane tylko w structs i nie mogę przypomnieć żadnego przypadku, w którym widziałem jakiekolwiek publiczne statyczne pole tylko do odczytu.

+0

'string.Empty' jest polem' public static readonly'. –

+0

'Type.Missing'' Type.EmptyTypes' i tak wiele przykładów publicznych statycznych tylko do odczytu pól –

0

podczas korzystania z const lub readonly w definicjach pól. Kwalifikator const może być używany z typami primitive data i tylko z ciągami znaków.Kiedy jest używana, wartość przypisana do pola const jest wstawiana bezpośrednio we wszystkich swoich odniesieniach w wygenerowanym kodzie IL. Dotyczy to również innych złożeń. Inne zespoły, które odwołują się do tego pola const, są kompilowane tak, jakby używały bezpośrednio samej wartości. Pola tylko do odczytu są stałymi w czasie wykonywania. Zajmują one miejsce w pamięci, a odniesienia do nich są rozwiązywane w czasie wykonywania, tak jakbyśmy odnosili się do zwykłej zmiennej. W rzeczywistości są to zmienne, które przypominają stałe.

const:

Zgodnie z ogólną zasadą, starają się unikać stałych, ponieważ wartość jest nie tylko zakodowane w zespole, w którym zostały zadeklarowane, ale również do wszelkich zespołów odwołujących się stałą wartość, jak również. Może to spowodować pewne dziwne problemy.

  • Nie może być statyczny.
  • Wartość jest obliczana podczas kompilacji.
  • Initiailized w deklaracji.

readonly:

  • może być instancja poziomu lub statyczne.
  • Wartość jest obliczana w czasie wykonywania.
  • Można zainicjować w deklaracji lub kodzie w konstruktorze.
0

Const jest wyrażeniem ocenianym podczas kompilacji. Kompilator może osadzić wartość bezpośrednio w każdym miejscu, w którym jest używana. Static read only będzie oceniany tylko w czasie wykonywania i jest przydatny, jeśli uważasz, że wartość może zostać zmieniona później, ponieważ zespoły skompilowane przeciwko twojemu nie będą miały statycznej wartości tylko do odczytu osadzonej, co może się zdarzyć ze stałą. Zwróć uwagę na niektóre wartości, takie jak DateTime.Now nie można zapisać w stałej, ponieważ jest to ocena właściwości, która musi zostać wykonana w środowisku wykonawczym. Możesz używać statycznego tylko do odczytu i będzie on podobny do stałej, ale przechwyci wartość w czasie wykonywania.

Ostatnia z nich to własność, która może znacznie więcej niż tylko zwrócić wartość. Może to być wynikiem zgłoszenia serwisowego lub złożonych obliczeń. Zauważ, że kod w usłudze może uzyskać inlined przez kompilator.

To, którego używasz, zależy od wybranej semantyki.

0

Hi znajdziesz odpowiedzi na pytania w tym poście:

Static readonly vs const

Można również sprawdzić kod IL i próbuje porównać wynik przez siebie.

+2

to nie wyjaśnia ikon wizualnych studio i przykład get –

0

Po prostu wyjaśniam twoje pierwsze pytanie.

Const; członkowie powinni otrzymać wartości początkowe w czasie kompilacji, a następnie nie można ich zmienić. Statyczny tylko do odczytu; wartości członków nie muszą być przypisane, aby zostać zainicjalizowane, a następnie przypisane. Po spotkaniu nie można zmienić jednokrotnie.

Dostęp do statycznych członków tylko do odczytu jest możliwy z poziomu klasy, do której należą, i można przypisać tę wartość. Pierwsze przypisanie wartości, której ma zostać przypisana wartość elementów, musi zostać wykonane lub konstruktor statyczny powinien zostać wykonany w transakcji.

Powiązane problemy