Czy to poprawna sytuacja, aby użyć stałej?

42

Więc mój profesor przekazał informacje zwrotne na temat projektu, nad którym pracowałem. Zadokował kilka znaków dla tego kodu:

if (comboVendor.SelectedIndex == 0) {
  createVendor cv = new createVendor();
  cv.ShowDialog();
  loadVendors();
}

Jest to w module obsługi „zmiany indeksu” combobox. Jest używany, gdy użytkownik chce utworzyć nowego dostawcę, moja najwyższa opcja (indeks 0, który nigdy się nie zmienia) otwiera okno dialogowe „Utwórz nowego dostawcę”. Tak więc zawartość mojego pola kombi wygląda następująco:

Create New Vendor...
Existing Vendor
Existing Vendor 2
Existing Vendor 3

Jego problem dotyczy kodu pierwszego wiersza:

if (comboVendor.SelectedIndex == 0)

Twierdzi, że 0 powinno być stałe i dlatego właśnie zadokował mi znaki. Twierdzi, że w ogóle nie powinienem używać literałów w moim kodzie.

Chodzi o to, że nie rozumiem, dlaczego chciałbym, aby ten kod był stały. Ten indeks nigdy się nie zmieni, ani nie jest to coś, co trzeba by poprawić. Wydaje się, że marnowaniem pamięci jest utrzymanie pojedynczego 0 w pamięci, która jest używana w bardzo konkretnej sytuacji i nigdy się nie zmienia.

Czerwony 5
źródło
32
On jest dogmatyczny. Liczb magicznych na ogół dobrze unikać. Myślę, że -1, 0 i 1 można uznać za wyjątki od tej reguły. Ponadto stała taka jak ta nie zajmowałaby więcej miejsca niż literalne 0.
Dave Mooney,
23
@DaveMooney: Czy jesteś pewien, że nie reagujesz gwałtownie? To prawda, że takie rzeczy jak -1w str.indexOf(substr) != -1dla „ strzawiera substr” jest perfekcyjnie uzasadnione. Ale tutaj znaczenie 0 nie jest ani oczywiste (jaki jest związek z tworzeniem nowego dostawcy?), Ani prawdziwie stałe (co, jeśli zmieni się sposób tworzenia nowego dostawcy?).
62
musisz nauczyć się zasad, zanim będziesz mógł je złamać
Ryathal
12
Ta metoda niespodziewanie mnie zawiodła. Lista została posortowana alfabetycznie. Użyłem - - Utwórz nowy - - aby myślniki posortowały pierwsze i kodowane na stałe indeks 0 do metody CreateNew. Następnie ktoś dodał element zaczynający się od pojedynczego cytatu „Mój przedmiot”, który sortuje przed myślnikami. Moje kodowanie na stałe spowodowało awarię programu przy następnym załadowaniu listy. Musiałem ręcznie zmodyfikować plik danych listy, aby odzyskać dane klienta.
Hand-E-Food,
14
Możesz int.Zerozamiast tego użyć go, aby był szczęśliwy :)
Paul Stovell

Odpowiedzi:

90

Właściwy sposób na zrobienie tego w języku C # nie polega wcale na kolejności elementów ComboItems .

public partial class MyForm : Form
{
    private readonly object VENDOR_NEW = new object();

    public MyForm()
    {
        InitializeComponents();
        comboVendor.Items.Insert(0, VENDOR_NEW);
    }

    private void comboVendor_Format(object sender, ListControlConvertEventArgs e)
    {
        e.Value = (e.ListItem == VENDOR_NEW ? "Create New Vendor" : e.ListItem);
    }

    private void comboVendor_SelectedIndexChanged(object sender, EventArgs e)
    {
        if(comboVendor.SelectedItem == VENDOR_NEW)
        {
            //Special logic for selecting "create new vendor"
        }
        else
        {
            //Usual logic
        }
    }
}
BlueRaja - Danny Pflughoeft
źródło
22
Cóż, jeśli jest to C #, nie powinieneś używać ALL_CAPS dla stałych. Stałe powinny być PascalCased - stackoverflow.com/questions/242534/…
Groky
4
@Groky: Dlaczego to ma znaczenie? Kogo obchodzi, jak nazywa swoje stałe? Jest to w 100% poprawne, jeśli używa ALL_CAPS w spójny sposób dla stałych.
marco-fiset,
4
@marcof: Cóż, jeśli stałe są częścią publicznego interfejsu, powinien postępować zgodnie ze wskazówkami nazewnictwa MS. Jeśli nie, to przynajmniej powinien wcześnie uczyć się najlepszych praktyk.
Groky
2
To wciąż jest nieprawidłowe. Przesuwa problem z posiadania literału całkowitego (zero) na literał łańcuchowy (Utwórz nowego dostawcę). W najlepszym razie problemem jest teraz „co, jeśli zmieni się etykieta” zamiast „co, jeśli zmieni się indeks”.
Freiheit,
7
@Freiheit: Niepoprawnie. Stała ciąg znaków służy tylko do wyświetlania; nie wpływa to w żaden sposób na logikę programu. W przeciwieństwie do używania magicznych wartości / ciągów do przechowywania stanu programu, zmiana tego ciągu (lub dodanie / usunięcie rzeczy z listy) nigdy niczego nie zepsuje.
BlueRaja - Danny Pflughoeft
83

Kolejność w polu kombi może ulec zmianie. Co jeśli dodasz inną opcję, np. „Utwórz dostawcę specjalnego ...” przed „Utwórz nowego sprzedawcę ...”

Zaletą używania stałej jest to, że jeśli istnieje wiele metod, które zależą od kolejności pola kombi, wystarczy zmienić stałą, a nie wszystkie metody, jeśli to się zmieni.

Używanie stałej jest również bardziej czytelne niż literał.

if (comboVendor.SelectedIndex == NewVendorIndex)

Większość skompilowanych języków zastąpi stałą w czasie kompilacji, więc nie ma ograniczenia wydajności.

Michael Krussel
źródło
5
Używałbym kodu opisowego w atrybucie wartości, zamiast polegać na indeksie, który można zmienić (przeniesienie opcji create na dół listy absolutnie zepsuje stałą metodę). Następnie poszukaj tego kodu.
CaffGeek,
1
@Chad Zgadzam się, że identyfikacja kontroli według kolejności w GUI jest bardzo delikatna. Jeśli język obsługuje dodawanie wartości do elementu gui, którą można wyszukać, użyłbym tego.
Michael Krussel,
3
@ rozwiązanie, ponieważ taka jest konwencja.
Ikke
3
@Ikke To zdecydowanie nie jest konwencja. stackoverflow.com/questions/242534/…
SolutionYogi
1
Jeśli mówimy o C #, to NewVendorIndex JEST konwencją. Jest zgodny z resztą stylu .NET.
MaR
36

Opisana przez ciebie sytuacja to wywołanie osądu, osobiście nie użyłbym jednego, gdyby był użyty tylko raz i jest już czytelny.

Prawdziwa odpowiedź brzmi jednak, że wybrał to, aby dać ci nauczkę.

Nie zapominaj, że jest profesorem, jego zadaniem jest nauczyć cię kodowania i najlepszych praktyk.

Powiedziałbym, że wykonuje całkiem dobrą robotę.

Pewnie, że może trochę zejść absolutnie, ale jestem pewien, że pomyślisz jeszcze raz przed użyciem magicznych liczb.

Dostał się pod twoją skórę na tyle, że możesz dołączyć do internetowej społeczności programistów, aby dowiedzieć się, co jest uważane za najlepszą praktykę w tej sytuacji.

Czapki z głów dla twojego profesora.

Thanos Papathanasiou
źródło
+1 za wskazanie, że w tym przypadku środki uzasadniają wynik końcowy
oliver-clare
@ Thanos- „ Nie zapominaj, że jest profesorem, jego zadaniem jest uczyć cię kodowania i najlepszych praktyk. ” Nigdy tak nie było w przypadku mojego profesora. Powiedziałbym, że jego zadaniem jest nauczyć cię tego, co departament uważa za ważne po utworzeniu kursu.
Ramhound
13

[...] moja najwyższa opcja (indeks 0, który nigdy się nie zmienia) otwiera okno dialogowe „Utwórz nowego dostawcę”.

Fakt, który musiałeś wyjaśnić, dowodzi, dlaczego powinieneś używać stałej. Jeśli wprowadzisz stałą NEW_VENDOR_DIALOG, kod będzie bardziej zrozumiały. Poza tym kompilatory optymalizują stałe, więc nie nastąpi zmiana wydajności.

Pisz programy dla programistów, a nie kompilatorów. Chyba że specjalnie próbujesz mikrooptymalizować, co nie wydaje się, że jesteś.

kba
źródło
2
-1 nawet za wzmiankę o wydajności. Nawet jeśli nie jest zoptymalizowany, komputer może wykonać miliardy operacji, zanim użytkownik to zauważy.
Boris Yankov,
3
@ Boris OP wydawał się zaniepokojony marnotrawstwem zasobów i dlatego o tym wspomniałem. Nie rozumiem, dlaczego moja odpowiedź byłaby z tego powodu mniej poprawna.
kba
12

Twierdzi, że 0 powinno być stałe i dlatego właśnie zadokował mi znaki.

Zgodziłbym się. Użycie zera tutaj jest „magią”. Wyobraź sobie, że czytasz ten kod po raz pierwszy. Nie wiesz, dlaczego zero jest wyjątkowe, a dosłowność nic nie mówi o tym, dlaczego zero jest wyjątkowe. Jeśli zamiast tego powiedziałeś, if(comboVendor.SelectedIndex == CreateNewVendorIndex)to dla czytelnika po raz pierwszy staje się niezwykle jasne, co oznacza kod.

Twierdzi, że w ogóle nie powinienem używać literałów w moim kodzie.

To skrajna pozycja; realistycznym stanowiskiem byłoby stwierdzenie, że użycie literałów jest czerwoną flagą wskazującą, że kod może nie być tak jasny, jak mógłby być. Czasami jest to właściwe.

Chodzi o to, że nie rozumiem, dlaczego chciałbym, aby ten kod był stały. Ten indeks nigdy się nie zmieni

To, że nigdy się to nie zmieni, jest doskonałym powodem, aby uczynić go stałym . Właśnie dlatego stałe nazywane są stałymi; ponieważ nigdy się nie zmieniają.

nie jest to też coś, co trzeba by poprawić.

Naprawdę? Nie widzisz żadnej sytuacji, w której ktoś mógłby chcieć zmienić kolejność rzeczy w polu kombi?

Fakt, że widzisz powód, dla którego może się to zmienić w przyszłości, jest dobrym powodem, aby nie zmieniać go na stałe. Powinno to raczej być niestałe pole liczb całkowitych tylko do odczytu. Stała powinna być ilość, która gwarantuje, że pozostanie taka sama przez cały czas . Pi i liczba atomowa złota są dobrymi stałymi. Numery wersji nie są; zmieniają każdą wersję. Cena złota jest oczywiście straszną stałą; zmienia się co sekundę. Rób tylko stałe rzeczy, które nigdy, nigdy się nie zmienią .

Wydaje się, że marnowaniem pamięci jest utrzymanie pojedynczego 0 w pamięci, która jest używana w bardzo konkretnej sytuacji i nigdy się nie zmienia.

Teraz dochodzimy do sedna sprawy.

Jest to być może najważniejsza linia w twoim pytaniu, ponieważ wskazuje, że masz dogłębne zrozumienie (1) pamięci i (2) optymalizacji. Jesteś w szkole, aby się uczyć, a teraz byłby świetny czas na prawidłowe zrozumienie podstaw. Czy możesz szczegółowo wyjaśnić, dlaczego uważasz, że „marnowanie pamięci w pamięci jest marnotrawstwem”? Po pierwsze, dlaczego uważasz, że optymalizacja wykorzystania czterech bajtów pamięci w procesie z co najmniej dwoma miliardami bajtów pamięci dostępnej dla użytkownika jest istotna? Po drugie, jakie zasoby według ciebie są tutaj konsumowane ? Co masz na myśli mówiąc, że „pamięć” jest konsumowana?

Interesują mnie odpowiedzi na te pytania po pierwsze, ponieważ są one okazją, aby dowiedzieć się, w jaki sposób rozumiesz optymalizację i zarządzanie pamięcią, a po drugie, ponieważ zawsze chcę wiedzieć, dlaczego początkujący wierzą w dziwne rzeczy, dzięki czemu mogę zaprojektować lepsze narzędzia, które doprowadzą ich do prawidłowych przekonań.

Eric Lippert
źródło
6

On ma rację. Masz rację. Jesteś w błędzie.

Ma rację, koncepcyjnie, że należy unikać magicznych liczb. Stałe zwiększają czytelność kodu poprzez dodanie kontekstu do znaczenia liczby. W przyszłości, gdy ktoś przeczyta Twój kod, będzie wiedział, dlaczego użyto określonej liczby. A jeśli musisz zmienić wartość gdzieś poniżej linii, zdecydowanie lepiej jest zmienić ją w jednym miejscu, niż próbować szukać wszędzie tam, gdzie używana jest określona liczba.

To powiedziawszy, masz rację. W tym konkretnym przypadku naprawdę nie sądzę, aby stała była uzasadniona. Szukasz pierwszego elementu na liście, który zawsze wynosi zero. Nigdy nie będzie 23. Or -pi. W szczególności szukasz zera. Naprawdę nie sądzę, że musisz zaśmiecać kod, czyniąc go stałym.

Mylisz się jednak, zakładając, że stała jest przenoszona jako zmienna, „wykorzystując pamięć”. Istnieje stała dla człowieka i kompilatora. Mówi kompilatorowi, aby umieścił tę wartość w tym miejscu podczas kompilacji, gdzie w innym przypadku wstawiłbyś literalną liczbę. I nawet gdyby nosił stałą w pamięci, dla wszystkich oprócz najbardziej wymagających aplikacji, utrata wydajności nie byłaby nawet mierzalna. Martwienie się o wykorzystanie pamięci przez jedną liczbę całkowitą zdecydowanie wpada w „przedwczesną optymalizację”.

Grandmaster B.
źródło
1
Prawie głosowałbym za tą odpowiedzią, gdyby nie trzeci akapit, twierdząc, że użycie dosłownego 0 jest wystarczająco jasne i żadna stała nie jest uzasadniona. Znacznie lepszym rozwiązaniem byłoby nie poleganie w ogóle na indeksowaniu elementu pola kombi, ale na wartości wybranego elementu. Stałe magiczne to stałe magiczne, nawet jeśli mają wartość 0 lub 3.14 lub coś w tym rodzaju - nazwij je odpowiednio, ponieważ dzięki temu kod jest bardziej czytelny.
Roland Tepp
Być może lepiej użyć wartości z listy, ale nie o to chodziło w jego pytaniu. Jego pytanie dotyczyło tego, czy jest to odpowiednie zastosowanie dla stałej. A jeśli porównamy wartość 0 w kontekście interakcji z GUI (z jakiegokolwiek powodu - być może ktoś szuka pierwszej pozycji niezależnie od wartości), myślę, że nie byłoby konieczne stosowanie stałej w tym miejscu.
GrandmasterB,
Nie zgodziłbym się ... Patrząc na kod, nigdy nie jest od razu oczywiste, jakie jest znaczenie 0 - może naprawdę jest tak, że zawsze szuka pierwszej pozycji na liście i to jest to, ale potem przeczytałby o wiele czystsze, gdyby porównanie to „comboVendor.SelectedIndex == FirstIndex” zamiast tego?
Roland Tepp,
2

Chciałbym zastąpić 0stałą, aby wyjaśnić znaczenie, takie jak NewVendorIndex. Nigdy nie wiadomo, czy Twoje zamówienie ulegnie zmianie.

Bernard
źródło
1

To jest całkowita preferencja twojego profesora. Zazwyczaj używasz stałej tylko wtedy, gdy literał zostanie użyty wiele razy, chcesz, aby czytelnik zrozumiał, jaki jest cel linii, lub twój literał prawdopodobnie zostanie zmieniony w przyszłości i chcesz tylko zmienić w jednym miejscu. Jednak w tym semestrze profesor jest szefem, więc odtąd robiłbym to w tej klasie.

Dobre szkolenie dla świata korporacji? Całkiem możliwe.

Jonathan Henson
źródło
2
Nie zgadzam się z częścią „używaj stałej tylko wtedy, gdy dosłowność będzie używana wielokrotnie”. Przy 0 (a może -1, 1) często jest to jasne, w większości przypadków dobrze jest nadać nazwę rzeczowi, który jest o wiele jaśniejszy podczas czytania kodu.
johannes,
1

Szczerze mówiąc, chociaż nie sądzę, aby twój kod był najlepszą praktyką, jego sugestia jest szczerze mówiąc trochę groteskowa.

Bardziej powszechną praktyką dla comboboxa .NET jest nadanie pustej wartości pozycji „Wybierz ..”, podczas gdy rzeczywiste pozycje mają znaczące wartości, a następnie:

if (string.IsNullOrEmpty(comboVendor.SelectedValue))

zamiast

if (comboVendor.SelectedIndex == 0)
Carson63000
źródło
3
W twoim przykładzie null jest po prostu kolejnym dosłownym. Istotą tej lekcji jest unikanie literałów.
przekroczenie
@overslacked - W moim przykładzie nie ma literału zerowego.
Carson63000,
Nawet jeśli istniało literał zerowy, null jest dopuszczalnym literałem do użycia, nawet nie sądzę, że istnieje sposób, aby sprawdzić, czy odwołanie do obiektu jest zerowe bez użycia sprawdzania, czy jest równe null.
Ramhound,
Carson63000 - miałem na myśli twoje użycie IsNullOrEmpty. Zamieniasz jedną „magiczną wartość” na inną. @Ramhound - Null w niektórych przypadkach jest literałem akceptowalnym, bez wątpienia, ale nie sądzę, że jest to dobry przykład (użycie wartości null lub blank jako magicznej wartości).
przekroczenie
-1 za „trochę groteskowy”. Chociaż masz rację, że użycie wartości byłoby bardziej konwencjonalne i łatwiejsze do zrozumienia, jeśli używasz selectedindex, użycie nazwanej stałej jest zdecydowanie lepsze niż tylko 0.
jmoreno
1

Nie myli się, podkreślając wartość używania stałych, a ty nie mylisz się w używaniu literałów. O ile nie podkreślił, że jest to oczekiwany styl kodowania, nie powinieneś tracić ocen za używanie literałów, ponieważ nie są one szkodliwe. Tak wiele razy widziałem dosłownie wszędzie używane w kodzie komercyjnym.

Jego punkt jest jednak dobry. Może to być jego sposób, aby uświadomić ci zalety stałych:

1-W pewnym stopniu chronią Twój kod przed przypadkowym naruszeniem

2-Jak mówi @DeadMG w swojej odpowiedzi, jeśli ta sama wartość literału jest używana w wielu miejscach, może przez pomyłkę pojawić się z inną wartością - więc stałe zachowują spójność.

3-Stałe zachowują typ, więc nie musisz używać czegoś takiego jak 0F, aby oznaczać zero.

4-Aby ułatwić czytanie, COBOL używa ZERO jako słowa zarezerwowanego dla wartości zero (ale pozwala także na użycie dosłownego zera) - Tak więc podanie wartości nazwy jest czasem pomocne, na przykład: (Źródło: ms-Constants

class CalendarCalc
{
    const int months = 12;
    const int weeks = 52; //This is not the best way to initialize weeks see comment
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

lub jak w twoim przypadku (jak pokazano w odpowiedzi @Michael Krussel)

Bez szans
źródło
2
Czy to nie będzie dziwna definicja dla dni w tygodniu? Jest 7 dni w tygodniu, a nie 7,4287143
Winston Ewert
@WinstonEwert, dzięki za komentarz. 365/52 = 7,01923076923077 = 7 + (1/52). Teraz, jeśli usuniesz część ułamkową i obliczysz 7 * 52, otrzymasz 364 dni, co nie jest prawidłową liczbą dni w roku. Posiadanie ułamka jest dokładniejsze niż jego utrata (ponieważ możesz sformatować wynik, aby wyświetlać 7, jeśli chcesz wyświetlać tylko liczbę). W każdym razie, to był tylko przykład z MS o stałych, ale twój punkt jest interesujący.
NoChance
1
Oczywiście to tylko przykład, ale sprzeciwiam się twojemu stwierdzeniu, że dokładniej jest uwzględnić ułamek. Tydzień definiuje się jako 7 dni. Biorąc pod uwagę twoją definicję, 26 tygodni to 182,5 dnia, co po prostu nie jest dokładne. Naprawdę problemem jest twój int weeks = 52, nie ma 52 tygodni rocznie. W ciągu roku jest 52.142857142857146 tygodni i to jest liczba, na którą powinieneś zachować ułamki. Oczywiście jedyną rzeczą, która w rzeczywistości jest stała w całym zestawie stałych, jest liczba miesięcy.
Winston Ewert,
0

Będziesz musiał ustawić ją na stałą tylko wtedy, gdy ma złożoną pochodną lub jeśli często się powtarza. W przeciwnym razie dosłowność jest w porządku. Stawianie wszystkiego na stałe to całkowita przesada.

DeadMG
źródło
Tylko jeśli rozważasz dwa razy często i nigdy nie musisz modyfikować kodu. Naprawdę łatwo jest tworzyć błędy, zmieniając jeden z dwóch przypadków.
BillThor
0

Właściwie, jak wspomniano, co się stanie, jeśli zmieni się pozycja? Możesz / powinieneś / powinnaś użyć kodu zamiast polegać na indeksie.

Tak więc, kiedy tworzysz listę wyboru, kończy się ona na html like

<select>
    <option value='CREATE'>Create New Vendor...</option>
    <option value='1'>Existing Vendor</option>
    <option value='2'>Existing Vendor 2</option>
    <option value='3'>Existing Vendor 3</option>
</select>

Następnie zamiast sprawdzać selectedIndex === 0, sprawdź, czy wartość jest CREATECODEstałą, która byłaby używana zarówno w tym teście, jak i podczas tworzenia listy wyboru.

CaffGeek
źródło
3
Prawdopodobnie dobre podejście, ale ponieważ używa C #, html nie jest najbardziej obiecującym przykładem.
Winston Ewert,
0

Pozbyłbym się tego całkowicie. Wystarczy umieścić przycisk Utwórz nowy obok listy pól kombi. Kliknij dwukrotnie pozycję na liście, aby edytować, lub kliknij przycisk. Nie przechowuj nowej funkcjonalności w combobox. Następnie magiczna liczba jest całkowicie usuwana.

Zasadniczo każdą literalną liczbę w kodzie należy zdefiniować jako stałą, aby umieścić kontekst wokół liczby. Co oznacza zero? W tym przypadku 0 = NEW_VENDOR. W innych przypadkach może to oznaczać coś innego, więc zawsze dobrym pomysłem jest czytelność i łatwość konserwacji, aby umieścić w tym kontekście pewien kontekst.

Jon Raynor
źródło
0

Jak powiedzieli inni, powinieneś użyć innej metody niż numer indeksu, aby zidentyfikować element pola kombi, który odpowiada danej akcji; lub możesz znaleźć indeks z logiką programową i zapisać go w zmiennej.

Piszę dlatego, by zająć się twoim komentarzem na temat „wykorzystania pamięci”. W języku C #, jak w większości języków, stałe są „składane” przez kompilator. Na przykład skompiluj następujący program i sprawdź IL. Przekonasz się, że wszystkie te liczby nawet nie trafiają do IL, nie mówiąc już o pamięci komputera:

public class Program
{
    public static int Main()
    {
        const int a = 1000;
        const int b = a + a;
        const int c = b + 42;
        const int d = 7928345;
        return (a + b + c + d) / (-a - b - c - d);
    }
}

wynikowa IL:

.method public hidebysig static 
    int32 Main () cil managed 
{
    .maxstack 1
    .locals init (
        [0] int32 CS$1$0000
    )

    IL_0000: nop
    IL_0001: ldc.i4.m1  // the constant value -1 to be returned.
    IL_0002: stloc.0
    IL_0003: br.s IL_0005

    IL_0005: ldloc.0
    IL_0006: ret
}

Niezależnie od tego, czy używasz stałej, literału, czy kilobajta kodu przy użyciu stałej arytmetyki, wartość jest traktowana dosłownie w IL.

Powiązany punkt: stałe składanie dotyczy literałów łańcuchowych. Wielu uważa, że ​​takie wywołanie powoduje zbyt wiele niepotrzebnych, nieefektywnych połączeń łańcuchowych:

public class Program
{
    public static int Main()
    {
        const string a = "a";
        const string b = a + a;
        const string c = "C";
        const string d = "Dee";
        return (a + b + c + d).Length;
    }
}

Ale sprawdź IL:

IL_0000: nop
IL_0001: ldstr "aaaCDee"
IL_0006: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_000b: stloc.0
IL_000c: br.s IL_000e
IL_000e: ldloc.0
IL_000f: ret

Konkluzja: Operatory na wyrażeniach stałych dają w wyniku wyrażenia stałe, a kompilator wykonuje wszystkie obliczenia; nie wpływa na wydajność w czasie wykonywania.

phoog
źródło