Deklaratsiya naqshlari va tip shablonlari ma'lum bir ifoda turining ishlash vaqtida belgilangan turga mos kelishini tekshirish uchun ishlatiladi. Bundan tashqari, deklaratsiya shablonidan foydalangan holda yangi mahalliy o'zgaruvchini e'lon qilishingiz mumkin. Agar deklaratsiya naqshlari ushbu ifodaga to'g'ri keladigan bo'lsa, quyidagi misolda ko'rsatilgandek, o'zgartirilgan ifodaning natijasi ushbu o'zgaruvchiga beriladi:
C #Nusxalash
object greeting = "Hello, World!";
if (greeting is string message)
{
Console.WriteLine(message.ToLower()); // output: hello, world!
}
C # 7.0 dan boshlab , shablon reklama turi T, agar bu ifoda NULLdan boshqa qiymat bo'lsa va quyidagi shartlardan biri bo'lsa, ushbu holatdagi ifodaga mos keladi:
Ishlash vaqtidagi ifodaning natija turi T.
Davrida, bir so'z natijasi turi turi olingan Tbir interfeysi, ijro etadi, Tyoki boshqa bir bor so'zsiz mos yozuvlar aylantirish uchun undan T. Quyidagi misolda ushbu shart to'g'ri bo'lgan ikkita holat ko'rsatilgan:
C #Nusxalash
var numbers = new int[] { 10, 20, 30 };
Console.WriteLine(GetSourceLabel(numbers)); // output: 1
var letters = new List { 'a', 'b', 'c', 'd' };
Console.WriteLine(GetSourceLabel(letters)); // output: 2
static int GetSourceLabel(IEnumerable source) => source switch
{
Array array => 1,
ICollection collection => 2,
_ => 3,
};
Oldingi misolda, usul birinchi marta chaqirilganda, GetSourceLabelbirinchi naqsh argumentning qiymatiga mos keladi, chunki ish paytida ushbu argumentning ( int[]) turi Array turidan olingan . Uslubga ikkinchi chaqiruvda GetSourceLabelish vaqti argument turi ( Ro'yxat ) Array dan olinmagan , lekin ICollection interfeysini amalga oshiradi .
Ishlash vaqtidagi ifodaning natija turi null tip va asosiy tipdir T.
Bir bor, boks yoki o'ramdan ochis aylantirish bir turiga, ish vaqtida bir so'z natija turini T.
Quyidagi misol oxirgi ikkita shartni ko'rsatadi:
C #Nusxalash
int? xNullable = 7;
int y = 23;
object yBoxed = y;
if (xNullable is int a && yBoxed is int b)
{
Console.WriteLine(a + b); // output: 30
}
Agar siz faqat ifoda turini tekshirmoqchi bo'lsangiz _, quyidagi misolda ko'rsatilgandek, o'zgaruvchining nomi o'rniga bo'sh o'zgaruvchini ishlatishingiz mumkin :
Ba'zan, dasturni bajarishda, oldindan ko'rish yoki ko'rish qiyin bo'lgan xatolar yuzaga keladi, ba'zan esa ularni umuman imkonsiz qilib qo'yadi. Masalan, faylni tarmoq orqali uzatishda tarmoq ulanishi to'satdan tushib ketishi mumkin. bunday holatlar istisno deb ataladi . C # tili ishlab chiquvchilarga ushbu vaziyatlarni boshqarish qobiliyatini beradi. Buni sinab ko'ring ... ushlang ... nihoyat qurish C # uchun mo'ljallangan .
bitta
2018-04-02 121 2
3
to'rt
besh
6
7
sakkiz
to'qqiz
10
o'n bir
12
|
try
{
}
catch
{
}
finally
{
}
|
A foydalanganda harakat ... catch..finally blok , barcha so'zlar sinash blokda birinchi ijro etiladi . Agar ushbu blokda istisnolar qo'yilmagan bo'lsa, u bajarilgandan so'ng nihoyat blok bajarilishini boshlaydi . Va keyin..soz..topincha qurish o'z ishini yakunlaydi.
Agar urinish blokiga istisno tashlansa, u holda normal ijro to'xtaydi va CLR istisno bilan ishlay oladigan tutash blokni qidirishni boshlaydi . Agar kerakli catch bloki topilsa, u bajariladi va tugagandan so'ng nihoyat blok bajariladi.
Agar kerakli tutish bloki topilmasa, istisno yuzaga kelganda, dastur buziladi.
Quyidagi misolni ko'rib chiqing:
bitta
2018-04-02 121 2
3
to'rt
besh
6
7
sakkiz
to'qqiz
10
o'n bir
|
class Program
{
static void Main(string[] args)
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
Console.WriteLine("Конец программы");
Console.Read();
}
}
|
Bunday holda, raqam 0 ga bo'linadi, buning natijasida istisno tashlanadi. Ilovani disk raskadrovka rejimida ishga tushirishda biz Visual Studio-da istisno haqida ma'lumot beradigan oynani ko'ramiz:
Ushbu oynada System.DivideByZeroException turidagi istisno, ya'ni nolga bo'linishga urinish tashlanganini ko'ramiz . Tafsilotlarni ko'rish elementidan foydalanib, istisno haqida batafsil ma'lumotni ko'rishingiz mumkin.
Va bu holda biz uchun faqat dasturning bajarilishini yakunlash qoladi.
Bunday g'ayritabiiy dasturni bekor qilinishiga yo'l qo'ymaslik uchun siz try ... catch ... ni ishlatishingiz kerak . Keling, misolni quyidagicha yozamiz:
bitta
2018-04-02 121 2
3
to'rt
besh
6
7
sakkiz
to'qqiz
10
o'n bir
12
13
o'n to'rt
o'n besh
o'n olti
17
o'n sakkiz
o'n to'qqiz
yigirma
21
22
|
class Program
{
static void Main(string[] args)
{
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
catch
{
Console.WriteLine("Возникло исключение!");
}
finally
{
Console.WriteLine("Блок finally");
}
Console.WriteLine("Конец программы");
Console.Read();
}
}
|
Bunday holda, biz yana blokda istisnoga ega bo'lamiz, chunki biz nolga bo'lishga harakat qilmoqdamiz. Va chiziqqa etib borish
dastur ishlamay qoladi. CLR ovlash blokini topadi va boshqaruvni ushbu blokga o'tkazadi.
Catch blokidan so'ng, nihoyat blok bajariladi.
Istisno chiqarildi!
Nihoyat blokirovka qiling
Dasturning oxiri
Shunday qilib, dastur hali ham bo'linishni nolga tenglashtirmaydi va shunga ko'ra, ushbu bo'linish natijasini ko'rsatmaydi, ammo endi u ishdan chiqmaydi va istisno blok blokida ko'rib chiqiladi.
Shuni ta'kidlash kerakki, ushbu qurilishda sinash bloki talab qilinadi . Tugatish bloki bilan biz oxirgi blokni qoldirib yuborishimiz mumkin:
bitta
2018-04-02 121 2
3
to'rt
besh
6
7
sakkiz
to'qqiz
10
|
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
catch
{
Console.WriteLine("Возникло исключение!");
}
|
Aksincha, nihoyat blok bilan, biz blok blokni qoldirib, istisno qilolmaymiz:
bitta
2018-04-02 121 2
3
to'rt
besh
6
7
sakkiz
to'qqiz
10
|
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
finally
{
Console.WriteLine("Блок finally");
}
|
Biroq, C # sintaksisining nuqtai nazari bo'yicha, bu qurilish juda to'g'ri, ammo shunga qaramay, CLR kerakli ushlash blokini topa olmaydi, istisno ko'rib chiqilmaydi va dastur ishdan chiqadi.
Do'stlaringiz bilan baham: |