C # proměnné inicializace Otázka

hlasů
12

Je nějaký rozdíl v tom, zda jsem inicializovat celočíselné proměnné, jako je:

int i = 0;
int i;

Má kompilátor nebo CLR to považovat stejnou věc? IIRC, myslím, že jsou oba považovány za stejnou věc, ale nemohu to najít článek.

Položena 04/06/2009 v 20:10
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
14

Pokud je proměnná i je proměnná instance, bude přiřazena hodnota 0 automaticky. Pokud se jedná o lokální proměnnou v metodě, je nedefinovaná, takže budete muset přiřadit mu hodnotu před jeho použitím.

Například:

class Program
{
    static void Main(string[] args)
    {
        intTest it;

        it = new intTest();

        Console.ReadLine();
    }

    class intTest
    {
        int i;

        public intTest()
        {
            int i2;

            Console.WriteLine("i = " + i);
            Console.WriteLine("i2 = " + i2);
        }
    }
}

Výše uvedené nebude sestavovat, protože i2 je zrušeno. Avšak tím, že přiřazení 0 až i2, tedy

int i2 = 0;

a kompilaci, pak běží, ukáže, že oba jsou nyní přiřazeny 0.

Odpovězeno 04/06/2009 v 20:13
zdroj uživatelem

hlasů
6

Podíval jsem se na IL (pomocí ildasm) a jeho pravda, že pouze int nastaven na 0 je opravdu nastaven na 0 v konstruktoru.

public class Class1
{
    int setToZero = 0;
    int notSet;
}

generuje:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       15 (0xf)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.0
  IL_0002:  stfld      int32 ClassLibrary1.Class1::setToZero
  IL_0007:  ldarg.0
  IL_0008:  call       instance void [mscorlib]System.Object::.ctor()
  IL_000d:  nop
  IL_000e:  ret
} // end of method Class1::.ctor
Odpovězeno 04/06/2009 v 20:34
zdroj uživatelem

hlasů
4

Ano, je to do značné míry je to samé.

Můžete odkazovat na tento článek na kódování Horror

Odpovězeno 04/06/2009 v 20:12
zdroj uživatelem

hlasů
1

Se všemi této řeči, je třeba zmínit „default“ klíčové slovo v jazyce C #.

Tj int i;je ekvivalentní int i = default(int);, která je ekvivalentní int i = 0; a MyClass o = default(MyClass);je ekvivalentníMyClass o = null;

To je důležité zejména při použití LINQ metody, jako .SingleOrDefault()proto, že vždy můžete použít následující, aby se váš kód čitelnější:

int someValue = collection.<various linq methods>.SingleOrDefault();
if (someValue == default(int))
{
  //Code for the default case
}

a

MyClass someValue = collection.<various linq methods>.SingleOrDefault();
if (someValue == default(MyClass))
{
  //Code for the default case
}
Odpovězeno 05/06/2009 v 05:14
zdroj uživatelem

hlasů
1

Jak ukazuje následující odkaz stavy, které jsou přesně stejné:

http://msdn.microsoft.com/en-us/library/aa664742%28VS.71%29.aspx

Odpovězeno 04/06/2009 v 20:13
zdroj uživatelem

hlasů
0

Různé reakce jsou zde trochu zavádějící, včetně citovaného článku v „kódování hrůzy“ internetové stránky.

Kompilátor optimalizuje kód, aby se odstranily všechny „zbytečné“ inicializace při nakonfigurován tak, aby optimalizovat vygenerovaný kód. Upozorňujeme, že se jedná o výchozí chování při kompilaci v režimu „Release“.

I pro jednoho, myslím, že je to vždy velmi užitečné inicializovat všechny proměnné. Hit výkon bude minimální v režimu ladění a nemá v režimu vydání, ale zisky z výslovně uvedených proměnných bude obrovská pro každého, kdo udržuje kód v budoucnu, v lepší „dokumentující kódu s kódem“ stylu. Vzpomínám si tento velmi zkušeného spolupracovníka můj, že si myslel, že výchozí hodnota Int32 byla Int32.MinValue namísto 0. Tyto druhy zmatku vždy se stane s věcmi implicited v kódu a ke mně, měli by se vyhnout ve většině případů.

Odpovězeno 01/01/2013 v 18:38
zdroj uživatelem

hlasů
0

Ty jsou rovnocenné pouze u polí (třída proměnných). Pole jsou automaticky přiřazeny výchozí hodnoty, když je třída inicializaci. V rámci metody nebo majetku, unassigned proměnná zůstává neobsazená a způsobí chybu kompilátoru při pokusu o přístup je to hodnota.

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

hlasů
0

Kdykoliv vytvoříte typ v jazyce C #, automaticky se dostane vyplněna s polstrovaným nulami. V případě třídy (referenční typu), je roven na ukazatel NULL. Takže technicky, kdykoli budete pracovat s třídami, tyto jsou stejné:

MyClass class;
MyClass class2 = null;

S typů hodnot (libovolný struct, včetně int / float / dvojitý / atd), typ je předán nulami, takže tyto jsou ekvivalentní:

int i;
int j = 0;

Nicméně, ve způsobu, překladač zkontroluje, zda jste přiřazena hodnota na vaše typů před použitím. Máte-li některý z následujících úkonů, kompilátor si stěžují:

int i;
Console.WriteLine{"{0}",i);

Z technického hlediska výše by měla být v pořádku - ale protože je to běžný zdroj chyb programátora, kompilátor specificky kontroluje nepřiřazeným lokální proměnné, a stěžuje si. Nicméně, to je v době kompilace stížnost, a není problém CLR. Můžete udělat IL, který dělá výše uvedené, a to běží v pohodě.

Odpovězeno 04/06/2009 v 20:22
zdroj uživatelem

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