[ k4rl0 @ 29.03.2007. 22:36 ] @
Brzo i kratko:
Koliko je unsafe mod C#-a koristan,dali dobiva na brzini,sto omogucava i koliko je isplativ i u kojim situacijama?
Hvala..
[ Pharos @ 30.03.2007. 11:48 ] @
U nekim slučajevima potreban je direktan pristup memoriji pa je dodat unsafe code.
Unsafe code ćeš koristiti veoma retko, a možda i nikad.

Kada ćeš koristiti unsafe code:
- Externe funkcije koje nisu iz .Net framework-a, a koje zahtevaju pointer kao argument. Primer je Windows API i ili neki .dll napisan u c/c++ čije f-je zahtevaju pointere...
- Real-time aplikacije gde želiš da poboljšaš preformanse. Mada takve aplikacije se u startu ne pišu u C#.
- Svuda gde je iz nekog razloga potreban direktan pristup memoriji jer jedino preko pokazivača možeš da barataš sa podacima na najefektivniji način.

Unsafe code ne treba da bude zamena za pisanje C/C++ koda unutar C#. Svaki od ovih jezika ima svoju primenu.
[ mmix @ 30.03.2007. 15:09 ] @
Ne bih se u potpunosti slozio sa svim ovim. Jedini performance benefit koji unsafe mode donosi sam po sebi je pristup nizovima preko pointera (gde se stedi na proveri granica niza). Sve ostalo ide istom brzinom, cak nekad i sporije (ako koristis pinned objekte ili GCHandle na managed objekte direktno se mesas u posao GC-a i usporavas upravljanje memorijom plus overtime da se objekat zakljuca/otkljuca).

Unsafe nije zamisljen kao low-level c#, to je jednostavno "logicka granica" gde prestaje da vazi .NET type safety (strong typed casting) i kao posledica toga prestaje da vazi type security (posto mozes npr da pinujes string i da ga vezes na char* pa stringovi izgube immutable karakterisitku, vidi kod dole), a sve to da bi se omogucio marshaling izmedju .NET-a i native sistema (C/C++ lib, COM, etc). Dakle kod se izvrsava isto kao i pre samo sto je sad to neka zona sumraka u kojoj je sve dozvoljeno , al na sopstveni rizik.

Code:

        static unsafe void test()
        {
            string test1 = "Trla baba lan";

            GCHandle gh = GCHandle.Alloc(test1, GCHandleType.Pinned);
            char* t1 = (char*)gh.AddrOfPinnedObject().ToPointer();
            *t1 = 'X';

            Console.WriteLine(test1);  // ispisace "Xrla baba lan"
        }
[ k4rl0 @ 30.03.2007. 15:39 ] @
Citat:
A sve to da bi se omogucio marshaling izmedju .NET-a i native sistema (C/C++ lib, COM, etc)


Jel preko unsafe codea onda moguce koristit native C++ API-je..?