Displey () usuli C # da bir xil miqyosda ishlatish uchun bir nechta jadvallarni ishlatganda so'raladigan tartibda kafolat bormi?

using (Stuff1 stf1 = new Stuff1(...))//Allocation of stf1
using (Stuff2 stf2 = new Stuff2(...))//Allocation of stf2
{
    try
    {
       //... do stuff with stf1 and stf2 here ...
    }
    catch (Stuff1Exception ex1)
    {
       //...
    }
    catch (Stuff2Exception ex2)
    {
       //...
    }
}//Automatic deterministic destruction through Dispose() for stf1/stf2 - but in which order?

Boshqacha qilib aytganda, stf2 ning Dispose() usuli avval qabul qilinadigan va keyin stf1 ning Dispose() usuli ikkinchi deb ataladigan kafolatlanadi. (Asosan: Dispose() usullari ular tegishli ob'ektni ajratishning teskari tartibida chaqiriladi?)

3

6 javoblar

so'zlarni ishlatish boshqa blok darajasidagi ko'rsatmalardan farqli emas. Agar shunday kod yozgan bo'lsangiz:

if (...)
    if (...)
    {

    }

Sizga qanday buyurtma yuz berishi aniq bo'ladi (men ushbu tuzilmani tavsiya qilmasam ham), chunki bu aynan bir xil:

if (...)
{
    if(...)
    {

    }
}

Shunday qilib yordamida ishlatiladi. Kodingiz quyidagilardan farq qiladi:

using (...)
{
    using(...)
    {

    }
}

Bu erda, ichki blokdan foydalanish birinchi bo'lib yakun topishi aniq va shuning uchun avval manba ko'rsatilishi kerak.

6
qo'shib qo'ydi
Katta narsalar :-) Rahmat!
qo'shib qo'ydi muallif user972301, manba

Ha, stf2.Dispose birinchi deb nomlanadi va undan keyin stf1.Dispose deyiladi

2
qo'shib qo'ydi
Javob uchun rahmat :)
qo'shib qo'ydi muallif user972301, manba

Foydalanish terminologiyasi, baribir, baribir sinab ko'ring. Uning faqat sintaksis shakli .. Shunday qilib, siz misolni kompilyatsiya vaqtida quyidagicha tarjima qilishda to'g'ri bo'lasiz:

try
{
    Stuff1 stf1 = new Stuff1());
    try
    {
        Stuff2 stf2 = new Stuff2();
    }
    finally
    {
        stf2.Dispose();
    }
}
finally
{
    stf1.Dispose();
}
2
qo'shib qo'ydi
Foydalanish bayonoti sehrli, ammo bu tushuntirish uning xatti-harakatlarini aniq va ravshan qiladi. Rahmat.
qo'shib qo'ydi muallif Rob Elliott, manba
Ok. Men C ++ dunyosidan keldim va bir nechta usulni sinab ko'rmoqchi bo'ldim, bu menga ma'lum narsalarni yozib olish kerakligiga yo'l qo'ymaslik uchun kerak bo'lgan barcha narsalarni ... yozib olishni talab qilmoqda Oldindan Oluşturucuda qilingan sozlash. Rahmat!
qo'shib qo'ydi muallif user972301, manba

Stuff2 Stuff1 oldin joylashadi, chunki u ichki blok ichida.

Siz Stuff1 uchun tashqi blokdan brauzerdan foydalanmagan bo'lsangiz ham, xuddi siz kabi xuddi shunday.

1
qo'shib qo'ydi
Ajoyib! Ma'lumot uchun tashakkur!
qo'shib qo'ydi muallif user972301, manba

Mumkin bo'lgan reordering tufayli hech qanday kafolat yo'q. Chiqarish yopiq jingalak (yoki sizning namunangizdagi yopiq) ga chaqiriladi. Siz optimallashmagan disk raskadrovka tuzilmalaridagi kutilgan buyruqni doimo ko'rasiz. Thread.MemoryBarrier dan foydalanishingiz mumkin. operatsiyalar tartibi.

using (Stuff1 stf1 = new Stuff1(...))//Allocation of stf1
using (Stuff2 stf2 = new Stuff2(...))//Allocation of stf2
{ {
    try
    {
       //... do stuff with stf1 and stf2 here ...
    }
    catch (Stuff1Exception ex1)
    {
       //...
    }
    catch (Stuff2Exception ex2)
    {
       //...
    }
} Thread.MemoryBarrier(); }

Release-mode optimizations are done in such a way as to guarantee predictable results on this thread after all instructions complete. Everything else (view from a different thread on a separate core) is up for grabs. It's not against the rules to have a situation where stf2 is not yet disposed, but stf1 is disposed, as observed from another thread. Unless you force the order of operations. Try writing some asserts and running under Jinx

1
qo'shib qo'ydi
Chikarish deterministik deb nomlanadi va u erda # 2 kodi # 1 dan oldin blokdan chiqadi
qo'shib qo'ydi muallif Andrew Barber, manba
Men C ++ dunyosidan kelganim uchun qiziqaman. Qanday holatlarda bu "qayta tartiblash" sodir bo'ladi?
qo'shib qo'ydi muallif user972301, manba
OK. Men uni olib tashlashni faqat bitta dublyaj rejimida kafolatlangan deb hisoblayman. Bilish yaxshi.
qo'shib qo'ydi muallif user972301, manba

Ha, Dispose usuli ishlatish doirasi oxirida chaqiriladi, shuning uchun Dispose() usullari ular tegishli ob'ektni taqsimlashning teskari tartibida chaqiriladi

0
qo'shib qo'ydi