Hirdetés

Keresés

Új hozzászólás Aktív témák

  • pmonitor

    aktív tag

    válasz Alexios #10081 üzenetére

    futtasd le ezt a kódot is és nézd meg az outputot, gondolom a nyelv maga se tudja miről beszél:
    int x = 1;
    Console.WriteLine(x is object);

    Ez valami vicc? Megnézted, hogy mire fordul? Megmutatom:
    bool b;
    int x = 0x11;
    b = x is int;

    ugyanez ASM-ben: 05465EF5 mov dword ptr [ebp-3Ch],1
    ezt mégegyszer kiemelem:mov dword ptr [ebp-3Ch],1
    Ezzel fordítási időben(ha létezik a változó), akkor azt mondja:
    Ha valaki megkérdezi, hogy 1 változó Object-e, akkor 1szerűen mond azt, hogy igen. Tehát már fordítási időben "beleégeti a kódba", hogy true-t adjon vissza. Ez ugyanaz, mintha ezt írnád:
    bool b = true;
    object obj = b;
    Console.WriteLine("{0}", obj);

    De ez is ugyanarra fordul:
    bool b = true;
    08455EEE mov dword ptr [ebp-3Ch],1
    int x = 1;

    Ezek az MS-es fiúk nagyon rafkósak ám!! :DD Bármiféle ellenőrzés nélkül kiíratják, hogy true!! ;] Ilyen "csalással" könnyű azt mondani, hogy minden object...
    Na de nézzük meg, hogy mi is történik akkor, amikor 1 érték típust beleteszünk egy objectbe:
    bool b = true;
    int x = 0x55;
    object obj = x;
    object obj2 = x as object;
    Console.WriteLine("{0} {1}", obj, obj2);

    Ez a következőre fodul:
    int x = 0x55;
    05175F21 mov dword ptr [ebp-3Ch],55h
    object obj = x;
    05175F28 mov ecx,4E0C8D0h
    05175F2D call CORINFO_HELP_NEWSFAST (0300300Ch)
    05175F32 mov dword ptr [ebp-48h],eax
    05175F35 mov ecx,dword ptr [ebp-48h]
    05175F38 mov eax,dword ptr [ebp-3Ch]
    05175F3B mov dword ptr [ecx+4],eax
    05175F3E mov ecx,dword ptr [ebp-48h]
    05175F41 mov dword ptr [ebp-40h],ecx
    object obj2 = x as object;
    05175F44 mov ecx,4E0C8D0h
    05175F49 call CORINFO_HELP_NEWSFAST (0300300Ch)
    05175F4E mov dword ptr [ebp-4Ch],eax
    05175F51 mov edx,dword ptr [ebp-4Ch]
    05175F54 mov ecx,dword ptr [ebp-3Ch]
    05175F57 mov dword ptr [edx+4],ecx
    05175F5A mov edx,dword ptr [ebp-4Ch]
    05175F5D mov dword ptr [ebp-44h],edx
    Console.WriteLine("{0} {1}", obj, obj2);

    Ebből ezeket a sorokat emelném ki:
    05175F2D call CORINFO_HELP_NEWSFAST (0300300Ch)
    05175F49 call CORINFO_HELP_NEWSFAST (0300300Ch)

    Ezekben a sorokban látszik, hogy 1 új object jön létre. Boxing történt. De ezek már nem érték típusok, hanem obj-ba és obj2-be bedobozolt int-ek. Ezek már referencia típusok, amiknek a mezőjében int van. És természetes, hogy vmi érték típust dobozolnak be 1 referencia típusba(obj, obj2), akkor az már referencia típus. Ha ellenőrizné is a program, hogy tényleg object-e az ősük, akkor is nyilván true-t adna vissza, hiszen ezek object-ek. Az más kérdés, hogy azért object-ek, mert bedobozolták őket. Ezt bizonyítja a következő kód is: 05175F3B mov dword ptr [ecx+4],eax
    Itt az ecx regiszterben van a típus azonosító(nevezhetjük object-nek), de az értéket [ecx+4]-be teszi bele(itt is látszik, hogy ez már referencia típus, mert eax értékét nem az dword ptr [ecx]-be teszi, hanem az object címét kihagyva az [ecx+4]-be. Ez is azt igazolja, hogy ez már referencia típus.

Új hozzászólás Aktív témák