Inicializace POD v jazyce C # - best practice

hlasů
0

Pokud vím [*], C # výchozí kluzná-old-data-typy ( int, float, bool, atd) do smysluplných hodnot. int a, float bA bool cvzít na hodnotách 0, 0.0fa false, v uvedeném pořadí.

Za předpokladu, že tomu tak je:

Měl jsem výslovně dát svým proměnných hodnot 0, 0.0fa falsepro přehlednost, nebo mám odejít hodnoty implicitní, čímž se snižuje množství kódu píšu, (pravděpodobně), snížení počtu chyb, mohu zavést do programu?

[*] Chcete-li být upřímný, po 10 minutách googling, jsem snaží se najít příslušnou dokumentaci, která potvrzuje to! Pokud někdo poukazuje na to, aby mě budu změnit otázku!

Položena 05/04/2009 v 16:41
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
4

C # nemá přiřadit žádnou výchozí hodnotu lokální proměnné. Tyto výchozí hodnoty se vztahují pouze na polích (členů třídy).

Pokud nechcete přiřadit hodnotu vaší lokální proměnné před prvním použitím, dostanete chybu kompilace :

static void Test() {
   int x;
   Console.WriteLine(x); // compile time error.
}
Odpovězeno 05/04/2009 v 16:43
zdroj uživatelem

hlasů
0

Subjektivní Odpověď níže :)

Mám pocit, že inicializace členů proměnných na své výchozí hodnoty by neměly být provedeno. Je nadbytečné a nepřináší tolik / žádnou hodnotu kódu.

Zjistil jsem, že většina lidí, kteří to přece mají silné zázemí v C ++ a následně si to zakořeněno v jejich mysli, že musíte inicializovat proměnné členů, aby se napsat správný kód (Jsem vinen zde). Jako takový této praxe jen přeloženy přes C #, kde to není skutečně nezbytné.

Ale to není něco, co jsem ztratil hodně spánku u konce. Pokud se lidé default inicializovat své proměnné mohu přidat nitpick komentář revizi kódu, ale nemám opravdu zaujmout pevný postoj k ní.

Odpovězeno 05/04/2009 v 16:46
zdroj uživatelem

hlasů
2

Statického / instance proměnných a prvků pole, ano, je to výchozí ně vhodné. Viz bod 5.2 této specifikace C # 3.0:


Následující kategorie proměnných, jsou automaticky nastaveny na výchozí hodnoty:

  • Statické proměnné.
  • Instance proměnné instancí tříd.
  • Prvky pole.

Výchozí hodnota proměnné závisí na typu proměnné a je stanovena takto:

  • Pro proměnné hodnotě typu, výchozí hodnota je stejná jako hodnota vypočítané výchozí konstruktor hodnotového typu je (§4.1.2).
  • Pro proměnnou referenčního typu, výchozí hodnota je null.

Inicializace na výchozí hodnoty se obvykle provádí tím, že správce paměti nebo garbage collector inicializovat paměť pro všechny bity nula, než je přidělena k použití. Z tohoto důvodu je vhodné používat všechny bity nula reprezentovat null reference.


Lokální proměnné nevadí, protože nemohou být použity před definitivně přidělen v každém případě.

K otázce, zda je třeba je explicitně inicializovat nebo ne, je to hlavně otázka osobních preferencí. Já bych za normálních okolností přiřadit hodnotu v prohlášení, pokud to bude přidělen v konstruktoru, například.

Je to opravdu není téma můžu dostat nadšeni, pokud jde o čitelnost, abych byl upřímný.

Odpovězeno 05/04/2009 v 16:46
zdroj uživatelem

hlasů
0

Když CLR inicializuje primitivní typ to dělá tak tím, že nulování se všechny bity pro daný typ. Takže pokud jde o CLR jde o následující:

int i;
bool b;

je ekvivalentní s výše uvedeným:

int i = 0;
bool b = false;

C # kompilátor však reuires, že inicializovat proměnnou dříve, než jej použít ve výrazu. Vždycky jsem si našel to trochu divné, ale ty jsou pravidla.

Odpovězeno 05/04/2009 v 16:47
zdroj uživatelem

hlasů
4

Řekl bych, že neinicializujete nich (pole). Bude to naprosto jasné, co se děje i bez nich.

Chtěl bych také říci, že nebude inicializovat lokální proměnné, dokud má významnou hodnotu pro ně, např I často vidět kód, který se podobá následující příklad:

private void SomeMethod()
{
    SomeObject myObj = null;

    if (SomeCondition)
    {
        myObj = someValue;
    }
    else if (SomeOtherCondition)
    {
        myObj = someValue;
    }
    else
    {
        myObj = someOtherValue;
    }
}

Nulová úkol je zbytečné, ale já opravdu pocit, že je škodlivá, jako kdybychom zapomněli přiřadit myObj v jednom z kódových cest, například pokud jsme přiřadili k yourObj spíše můj myObj v jinde, pak bychom skončit s myObj sadou na null, které by v konečném důsledku projevuje jako nulový referenční výjimku v určitém pozdějším okamžiku během běhu. Bez přiřazení inital null pak by to být kompilace chybu - mnohem jednodušší řešení.

Odpovězeno 05/04/2009 v 16:50
zdroj uživatelem

hlasů
1

Členské proměnné jsou inicializovány na výchozí hodnoty (tj nula nebo null).

Pokud přiřadíte výchozí hodnotu pro členské proměnné a provést analýzu kódu, to chytí to a dává vám DoNotInitializeUnnecessarily varování.

Odpovězeno 05/04/2009 v 16:54
zdroj uživatelem

hlasů
0

Mající konstantní expozici vůči mnoha různých programovacích jazyků, nikdy věřit kompilátor / interpret přiřadit výchozí hodnoty proměnných pro mě. Dělat, že sám je triviální, a zajišťuje, že proměnná není inicializovat:

  • s náhodná data vysedáváním v paměti
  • od vstupních polí uživatelem , což je potenciální bezpečnostní riziko, zejména pokud se používá tato data při interakci s databází, nebo ještě hůře, s operačním systémem
Odpovězeno 05/04/2009 v 17:36
zdroj uživatelem

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