|
[ Valerij Zajcev @ 21.07.2007. 21:50 ] @
| Code:
public static void Main(string[] args)
{
//ovaj prvi deo bi mi bio boxing
int i = 32;
broj x = new broj();
x.f_xxx = i;
Console.WriteLine(x.f_xxx); // <--
Console.WriteLine(i);
// ovo dole je predpostavljam unboxing
int g = 0;
g = x.f_xxx;
Console.WriteLine(g);
}
class broj
{
public int f_xxx;
}
Jel se ovako upotrebljava box/unbox?
I da koja je razlika izmedju int i Int32, tj. ima li neko pravilo kada se sta koristi? |
[ jablan @ 21.07.2007. 22:31 ] @
Citat: Valerij Zajcev: Jel se ovako upotrebljava box/unbox?
I da koja je razlika izmedju int i Int32, tj. ima li neko pravilo kada se sta koristi?
Koliko vidim uopšte nemaš boxing, a samim tim ni unboxing. Kapiraš li razliku između value i reference promenljivih?
Nema razlike između int i Int32.
[ toxi_programer @ 21.07.2007. 22:57 ] @
Evo ga box-ing:
Console.WriteLine(x.f_xxx); // <--
pošto je f_xxx tipa integer on se mora prvo "spakovati" u object tip. U C++ for .NET se moralo i izričito navoditi ovako:
Console.WriteLine( __box(x.f_xxx)); // <--
a u C#-u se to radi implicitno..
Dalje,
// ovo dole je predpostavljam unboxing
int g = 0;
g = x.f_xxx;.
nema ovde unboxing-a nigde.
Ali evo ga box-ing opet:
Console.WriteLine(g);
[ jablan @ 21.07.2007. 23:24 ] @
Citat: toxi_programer: Evo ga box-ing:
Console.WriteLine(x.f_xxx); // <--
pošto je f_xxx tipa integer on se mora prvo "spakovati" u object tip.
Zašto? WriteLine ima overload Console.WriteLine (Int32).
[ toxi_programer @ 22.07.2007. 12:38 ] @
Hm... Heh... :) Pa da.
Ali boxing bi se "desio" o npr. ovakvoj situaciji:
Console.WriteLine("Moj broj je: {0}", 16);
U svakom slučaju, Valerij Zajcev, još primer za boxing je:
Code:
ArrayList ar = new ArrayList();
int broj = 16;
ar.Add( broj); // za ovo bi u C++ morao da napišeš: ar->Add( __box( broj)); dakle u ovoj liniji se "prevodi" int u Object
[ mmix @ 22.07.2007. 13:20 ] @
AKo posmatrate lingvisticki onda je to primer boxovanja, ali ako gledamo tehnocloski boxing u .NETu je nesto potpuno drugo. Boxing je mogucnost da value type uboxujes u reference type (da bi ga koristio kao reference), na da zadrzis valuetype kao polje reference tipa.
To se radi preko object tipa:
Code:
int x = 21;
object xo = x; // boxing
Console.Write(xo); // posto je parametar object, write poziva ToString() koji vraca 21, ovo nije unboxing
int y = (int)xo; // unboxing, y postaje 21 kao value "kopija" xo-a
x = 42; // boxed integer nije pokazivac na x, promena x-a ne menja xo
int je kompajlerski alijas za System.Int32 i tako ce i ostati. Mislim da je inicijalni plan bio da se int vezuje za bitnost platforme (tj, da kompajlirano za 64bita int bude alias za System.Int64), ali se od toga odustalo, i na 64-bit platformi int predstavlja int32.
[Ovu poruku je menjao mmix dana 22.07.2007. u 14:35 GMT+1]
[ Valerij Zajcev @ 22.07.2007. 13:33 ] @
zbunjuje me sto su svi primeri na koje naidjem napisani upotrebom object:
i = 3;
object o = i;
Nasao sam da je objekt u stvari alias za System.Object
Ali u mom primeru x je ref na objekat klase broj, znaci da je ref tipa, ako kazem x = i; prijavi compile time gresku kada stavim x.f_xxx = i; sve je ok, ovaj je ref tipa ovaj je value i radi, i zato sam ja mislio da je to box.
[ maksvel @ 22.07.2007. 13:58 ] @
Citat: mmix:
int je kompajlerski alijas za System.Int32 i tako ce i ostati. Mislim da je inicijalni plan bio da se int vezuje za bitnost platforme (tj, da kompajlirano za 64bita int bude alias za System.Int64), ali se od toga odustalo, i na 64-bit platformi int predstavlja int32.
Hm, i ja sam mislio da će integer pratiti bitnost platformew. Zanimljiva informacija...
[ Shadowed @ 22.07.2007. 14:22 ] @
Da li vazi ista stvar i za Integer u VB-u?
[ negyxo @ 22.07.2007. 14:25 ] @
Za zavisnost od platforme postoji IntPtr, pa kome treba...
[ Valerij Zajcev @ 22.07.2007. 14:33 ] @
@mmix, object xo = x; // boxing, kapiram da umesto object moze da stoji i ArrayList jer je to ref tipa, ali kako bi onda izgledalo da imam klasu "class Klasa" i objekat, Klasa ime = new Klasa(); Ime je ref tipa zasto kada stavim "i = 5; ime = i;" dobijam gresku?
[ Shadowed @ 22.07.2007. 15:24 ] @
Zato sto int nije Klasa ali jeste Object :)
[ mmix @ 22.07.2007. 16:09 ] @
Citat: Valerij Zajcev: @mmix, object xo = x; // boxing, kapiram da umesto object moze da stoji i ArrayList jer je to ref tipa, ali kako bi onda izgledalo da imam klasu "class Klasa" i objekat, Klasa ime = new Klasa(); Ime je ref tipa zasto kada stavim "i = 5; ime = i;" dobijam gresku?
E pa tu ti je logicka greska  , ne moze da stoji ArrayList, ako stoji ArrayList onda nije boxing. Boxing moze samo i iskljucivo iz value tipa (int, double, itd) u object tip. Pogledaj opet toxijev primer, on jeste instancirao ArayList, ali nije posle rekao ar = broj;, nego ar.Add(broj);, znaci pozavo je metod Add(object) da doda element u listu i kompajler je njegov broj uboxovao u object tip da bi ga prosledio metodi Add. Sam ar je istao isti, referenca na instancu objekta ArrayList.
[ android~paranoid @ 16.09.2007. 11:31 ] @
Citat: When you box a value, you get an object upon which you can invoke methods, properties, and events.
For example, once you have converted the integer into an object, as shown in this code snippet, you
can call methods that are defined in System.Object, including ToString( ), Equals( ), and so forth.
Razumem svrhu konvertovanja ali...
u cemu je u ovom slucaju stos, kad ove metode koje se navode mogu da pozovem i bez konvertovanja u objekat?
[ boki @ 17.09.2007. 00:24 ] @
u C# i VB mozes jer oni rade boxing implicitno. u C++u moras da uradis explicitno.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|