Fizika-matematika fakulteti amaliy matematika va informatika
Download 435.43 Kb.
|
Otaboyev Mashrabjon dasturlash kurs ishi 25 06
classDisposableClass : IDisposable
{ publicvoidDispose() { // ... namuna egallagan resurlar bu yerda chiqadi } } using (DisposableClass obj = new DisposableClass(...)) { // ... obj obyektidan foydalangan holda kod } // ... bu yerda Dispose usuli obj obyekti uchun chaqirilishi kafolatlangan Javada bunday qurilish mavjud emas va obyektni tozalash faqat qo’lda amalga oshirilishi mumkin classAnyClass{ voidclear(){ // ... bu yerda tozalash kodi } } AnyClass obj =new AnyClass(...); try{ // ... obj obyektidan foidalangan holda kod } finally{ obj.clear();// - undan foidalanishni tugatgandan so’ng obyektni tozalash usuliga aniq murojat } Java7 C# ga o’xshash bolinma bilan avtomatik tozalashni taminlaydigan try-with-resources’ konstruktsiyasini qoshdi: try(BufferedReader br =newBufferedReader(new FileReader(path))){ returnbr.readLine(); } Sinov blokidan chiqqanda uning sarlavhasida qiymat berilgan barcha ob'ektlar (bayon blokining oldidagi qavslar) o'chiriladi. Ushbu ob'ektlarning sinflari java.lang.AutoCloseable tizim interfeysini amalga oshirishi shart. Java sizga tinglovchini ro'yxatdan o'tkazishga imkon beradi, u havola axlat yig'ilganda xabarlarni oladi va bu WeakHashMap ishini yaxshilaydi. C # (aniqrog'i, CLR muhiti) sizga GC.SuppressFinalize (obj) usuli (masalan, fayl oqimida SQL ulanishi) yordamida berilgan ob'ekt uchun yakunlovchi ishlashni bekor qilish imkonini beradi. Bu foydalidir, chunki axlat yig'ish ancha qimmatga tushadi va yakunlovchi tayyor ob'ekt uzoq umr ko'radi. Ob'ekt asboblari [tahrirlash | kodni tahrirlash] Ikkala til ham ob'ektga yo'naltirilgan bo'lib, C ++ dan meros bo'lib qolgan, ammo sezilarli darajada qayta ishlangan. Kod va ma'lumotlarni faqat sinflar ichida tavsiflash mumkin. Enkapsulatsiya [tahrir | kodni tahrirlash] Java-da, tavsifdagi himoyalangan modifikator, avlod sinflaridan kirishga qo'shimcha ravishda, egasi sinfi bilan bir xil to'plamga kiritilgan barcha sinflarga kirishga imkon beradi. C # da, yig'ilish ichida ko'rinishi kerak bo'lgan ob'ektlar uchun (Java to'plamining taxminiy analogi) alohida ichki modifikator (Java-da standart sozlamaning analogi) joriy qilingan va C ++ -dan olingan - asl ma'nosini saqlab qolgan - faqat avlod sinflariga kirish. Ichki va himoyalanganlarni birlashtirishga ruxsat beriladi - keyin Java-da himoyalangan joyga mos keladigan kirish maydoniga ega bo'lasiz. Ichki sinflar [tahrir | kodni tahrirlash] Ikkala til ham sinf ichida sinfni aniqlashga imkon beradi. Java-da ichki sinflar yopilishlarni taqlid qilish uchun ishlatiladi. Java ichki sinflari ota-sinfning statik bo'lmagan a'zolariga kirish huquqiga ega, ya'ni "bu haqida biling"; Bundan tashqari, usullar ichida siz mahalliy o'zgaruvchilarga o'qishga kirish imkoniga ega bo'lgan mahalliy sinflarni va noma'lum (anonim) mahalliy sinflarni aniqlab olishingiz mumkin, ular aslida sizning foydalanishingiz joyida sizning sinfingiz usullari bilan bir-biriga mos keladigan ob'ektlar va interfeyslar misollarini yaratishga imkon beradi. Hodisalarga ishlov berish ushbu mexanizmga Java dasturlarida qurilishi mumkin (hodisa manba ishlovchilari sinfida mavhum bo'lgan usul chaqiruvini keltirib chiqaradi; muayyan joyda ishlov beruvchiga ehtiyoj seziladi, dasturchi mahalliy anonim sinf namunasini yaratadi - asosiy ishlov berish sinfining vorisi va undan to'g'ridan-to'g'ri foydalanadi) . Shunday qilib, hodisalarni maxsus turga va sintaktik qo'llab-quvvatlashga ehtiyoj yo'qoladi, ammo ishlov beruvchilarni yaratadigan kodni tushunish biroz qiyinroq. Xususan, o'zgaruvchilar doirasi yanada murakkablashadi. C # da yopilish va lambdalar mavjud. C # yondashuvi C ++ ni ko'proq eslatadi: C # ichidagi sinflar faqat tashqi sinfning statik a'zolariga kirish huquqiga ega va statik bo'lmagan a'zolarga kirish uchun siz tashqi sinf misolini aniq ko'rsatishingiz kerak. C # dagi mahalliy ichki sinflar qo'llab-quvvatlanmaydi. Java-da, 8-versiyadan boshlab, lambda iboralari ham paydo bo'ldi. Usullari [tahrir | kodni tahrirlash] Ikkala tilda ham metodlar sinf funktsiyalari orqali aniqlanadi. Usulning tanasi sinf tavsifi ichida joylashgan. Statik usullar, mavhum usullar qo'llab-quvvatlanadi. C # shuningdek, interfeys usullarini aniq amalga oshirish mavjud, bu sinfga interfeys usullarini o'z usullaridan alohida amalga oshirishga yoki ikkita turli xil interfeyslarga tegishli bo'lgan bir xil usullarning turli xil amaliy dasturlarini berishga imkon beradi. Java8 standart interfeys usullarining bajarilishini aniqlashga imkon beruvchi standart operatorni taqdim etdi. Shunday qilib, interfeysni amalga oshiradigan sinf standart usullarni amalga oshirish majburiyatidan xalos bo'ladi, ammo ularni bekor qilishi mumkin. Java-da ibtidoiy turlar (bayt, int, er-xotin, suzuvchi, mantiqiy va boshqalar) qiymat bo'yicha, qolganlari (ob'ekt) uchun esa ob'ektga havolalar qiymat bo'yicha o'tkaziladi. C # da, ibtidoiy turlarga qo'shimcha ravishda, ular struktura qiymati bo'yicha (mazmunli deb ataladigan turlar), boshqa turlar esa mos yozuvlar orqali beriladi (mos yozuvlar turlari). C # shuningdek, mos yozuvlar bo'yicha parametrlarni aniq tavsiflashni qo'llab-quvvatlaydi (rad va kalit so'zlar). Foydalanishda kompilyator usulda qiymat tayinlanishini tekshiradi. Ularni faqat boshqarishni talab qiladigan kod bilan ishlashda foydalaning (masalan, Winapi), chunki bu OOP tushunchasini buzadi [manba ko'rsatilmagan 52 kun]. C # da, usullarga sinf nomiga mos keladigan nom berish taqiqlanadi, bu xatolarga yo'l qo'ymaydi (Java-da, dasturchi bu usul bo'lgan konstruktorni aniqlay oladi) [4]. Usullarning foydaliligi [tahrir | kodni tahrirlash] C # C ++ virtual usullari kontseptsiyasini ko'chiradi: virtual usul virtual kalit so'z bilan aniq e'lon qilinishi kerak, boshqa usullar virtual emas. Virtual usullarning shunday tanlangan deklaratsiyasi C # da joriy qilingan, chunki barcha usullarning virtual deb e'lon qilinishi bajarishni sezilarli darajada sekinlashtirishi mumkin [6]. Bunga qo'shimcha ravishda, C # aniqlangan deklaratsiyani talab qilinadigan sinfda virtual usulning bekor qilingan kalit so'z bilan takrorlashini talab qiladi. Agar siz virtual usulni yashirishni xohlasangiz, ya'ni xuddi shu nom va imzoga ega bo'lgan yangi usulni kiritmoqchi bo'lsangiz, yangi kalit so'zni ko'rsatishingiz kerak (yo'qligida kompilyator ogohlantirishni keltirib chiqaradi). Mavhum usullarni yashirish taqiqlanadi. Muhrlangan kalit so'z bilan bekor qilish usulini e'lon qilish avlodlar sinflarida ushbu usulni bekor qilishni taqiqlaydi, ammo baribir uni yashirishga imkon beradi. Java-da, aksincha, statik usullardan tashqari barcha ommaviy usullar virtualdir va amal qilish mexanizmi yoqilmasligi uchun ushbu usulni aniqlab bo'lmaydi. Usul har doim bir xil nom va imzoga ega bo'lgan bazaviy klass usulini deyarli bekor qiladi. Yakuniy kalit so'z, olingan darslarda bir xil imzoga ega bo'lgan usul yaratilishini oldini olishga imkon beradi. Java yondoshuvi sintaktik jihatdan sodda, u ob'ektga tegishli bo'lgan sinf usuli doimo chaqirilishini ta'minlaydi. Boshqa tomondan, fazilat har doim ham kerak emas va virtual usullarni jalb qilishning qiymati biroz kattaroq, chunki bu qo'ng'iroqlar odatda ichki almashtirishdan o'tmaydi va virtual usullar jadvaliga qo'shimcha kirishni talab qiladi Barcha usullarning amaliyligi xavfli bo'lishi mumkin: agar dasturchi noto'g'ri tayanch sinfda bo'lgan usulni e'lon qilsa, uni takrorlamoqchi emas, lekin shunchaki bunday usul allaqachon mavjudligiga e'tibor bermasa, u holda yangi usul asosiy sinfda xuddi shu nomdagi usulni bloklaydi. C # da shunga o'xshash xatolik yuz berishi mumkin, ammo kompilyator sizni takrorlash usuli yangi va bekor qilinmasdan e'lon qilinganligi haqida ogohlantiradi. Java 5 shunga o'xshash mexanizmni joriy qildi - agar usul ajdodlar sinfining virtual usulini bekor qilsa, kompilyator ogohlantirish hosil.Ma'lumot turlari [tahrir | kodni tahrirlash] Ibtidoiy turlari [tahrir | kodni tahrirlash] Ikkala til ham ibtidoiy turlar g'oyasini qo'llab-quvvatlaydi (bu C qiymatida qiymat turlarining to'plami) va ikkalasi ibtidoiy turlarni ob'ekt turlariga tarjima qilish uchun ularni avtomatik ravishda "qadoqlash" ni ob'ektga (box) va "qutisiga" C # da ibtidoiy turlarga ob'ektlar sifatida kirish mumkin, va bu C # mashhurligi bilan bog'liq bo'lgan sabablardan biridir. Java-da ibtidoiy turlar va ob'ekt turlari ajratilgan, o'rash sinflari ob'ektlar sifatida ibtidoiy turlarga murojaat qilish uchun qo'llaniladi.Barcha imzolangan imzolar bilan bog'langan imzo qo'yilmagan imzo turlari va yuqori aniqlikdagi sobit nuqta hisob-kitoblari uchun maxsus o'nlik turlar mavjudligi sababli Java-ga qaraganda C # da ko'proq ibtidoiy turlar mavjud (buning uchun Java-da java.math.BigInteger va java sinflari ishlatiladi). math.BigDecimal). Java tilni soddalashtirish uchun imzolanmagan turlardan voz kechdi. Bunday turdagi ma'lum muammolardan biri arifmetik operatsiyalar natijasini turini ikki argument bo'yicha aniqlash qiyinligi, ulardan biri imzolangan, ikkinchisi imzosiz. Til bunday operatsiyalarni qanday qoidalarni qabul qilishidan qat'iy nazar, ba'zi holatlarda bu xatolarga olib keladi (masalan, C ++ da, imzolangan va imzo qo'yilmagan qiymatdagi operatsiya imzolanmagan natijani beradi; natijada 16 bitli raqamlar bilan hisoblashda "40,000 / (-4") ifodasi ) ”Natijasi −10000 emas, 55536 bo'ladi). Biroq, bu muvaffaqiyatsizlik uning muammolarini ko'taradi; chunki past darajada ishlatilgan texnik ma'lumotlarning katta qismi (masalan, uskunalar tomonidan uzatiladigan va operatsion tizimning API funksiyalari tomonidan qaytariladigan turli xil xizmat ma'lumotlari) imzolanmagan butun turga kiradi va bunday turlarning mavjud emasligi ma'lumotlarni almashtirish uchun xavfli operatsiyalarni amalga oshirish zarurligiga olib keladi, ba'zi hollarda esa - Oddiy imzolanmagan arifmetikadan foydalanib, aniq bo'lmagan noaniq kombinatsiyalar bilan almashtiriladi. Tuzilmalar (yozuvlar) [tahrirlash | kodni tahrirlash] C # sizga tizim kalit so'zidan foydalangan holda maxsus qiymat turlarini yaratishga imkon beradi. Bu C ++ tilining to'g'ridan-to'g'ri merosi bo'lib, Java yaratuvchilari qasddan rad etishgan. Sinf misollaridan farqli o'laroq, cos qiymat turlari misollari ular yaratish uchun yangi operatorning faqat bitta chaqirig'ini talab qiladi, va bosqichma-bosqich bo'lganlar har bir satr uchun ko'chadan xotirani aniq ajratishni talab qiladi. Parametrlangan (umumlashtirilgan) turlar [tahrir | kodni tahrirlash] Ikkala tilda ham parametrlarni ajratish mumkin, ular umumlashtirilgan dasturlash paradigmasini qo'llab-quvvatlaydi. Sintaktik jihatdan, bu tur ta'rifi juda yaqin - ikkala tilda ham u C ++ shablonlaridan meros bo'lib qolgan, ba'zi o'zgarishlar bo'lsada. Java-da tiplarni umumlashtirish faqat lingvistik konstruktsiyalar bo'lib, faqat kompilyatorda amalga oshiriladi. Tuzuvchi barcha umumiy turlarni yuqori chegaralari bilan almashtiradi va parametrlashtirilgan tur ishlatiladigan joylarda tegishli turdagi konversiyani kiritadi. Natijada baytekod bo'lib, unda umumiy turlarga va ularning parametrlariga havolalar mavjud emas. Umumiy turlarni amalga oshirishning ushbu uslubi tip tipidagi o'chirish deyiladi. Bu shuni anglatadiki, manbaning umumlashtirilgan turlari to'g'risida ma'lumot ish vaqtida mavjud emas va ba'zi bir cheklovlarni keltirib chiqaradi, masalan, umumiy tipdagi argumentlardan yangi misollar yaratish imkoniyati yo'qligi. Java ish vaqti umumiy tipdagi tizim bilan yaxshi tanish emas, shuning uchun yangi JVM dasturlari yangi sinf formati bilan ishlash uchun minimal yangilanishlarni talab qiladi. C # boshqa tomonga o'tdi. Umumiylashtirishni qo'llab-quvvatlash birinchi marta .NET 2.0 da paydo bo'lgan virtual ish vaqtiga qo'shildi. Bu erda til atrof-muhitning ushbu xususiyatlariga kirish uchun faqat tashqi interfeysga aylandi. Java-da bo'lgani kabi, kompilyator statik turni tekshirishni amalga oshiradi, ammo bunga qo'shimcha ravishda, JIT yuklash vaqtida tekshirishni amalga oshiradi. Umumiy turlar to'g'risidagi ma'lumotlar ish vaqtida to'liq mavjud bo'lib, generik turlarning aks ettirishini va ularning yangi turlarini yaratishni to'liq qo'llab-quvvatlashga imkon beradi. Java yondoshuvi ish vaqtida qo'shimcha tekshiruvlarni talab qiladi, kod mijozi turlarni mos kelishini kafolatlamaydi va umumiy turlar uchun aks ettirishni ta'minlamaydi. Java ixtisoslashgan umumlashtirilgan turlarning ibtidoiy bo'lishiga yo'l qo'ymaydi (bu faqat ibtidoiy turlarni sinflarga o'rash orqali amalga oshirilishi mumkin), C # esa esa mos yozuvlar turlari va qiymat turlari, shu jumladan ibtidoiy turlari uchun ham umumlashtirishni ta'minlaydi. Buning o'rniga Java o'ralgan ibtidoiy turlarni parametr sifatida ishlatishni taklif qiladi (masalan, List Voqealar bilan ishlash [tahrir | kodni tahrirlash] Java dasturchidan kuzatuvchi naqshini qo'lda bajarishni talab qiladi, garchi u anonim joylashtirilgan sinflar shaklida ba'zi sintaktik shakarni beradi, bu sizga sinfning tanasini aniqlash va shu zahotiyoq kodning bir nuqtasida misol yaratishga imkon beradi. C # til darajasida voqealar darajasidagi dasturlarni keng qamrovli qo'llab-quvvatlaydi, jumladan .NET delegatlari, multastasting, sinflardagi voqealarni aniqlash uchun maxsus sintaksis, tadbirlarni boshqarish va ro'yxatdan o'tkazish operatsiyalari, vakillar kovaryansi va yopilish semantikasining to'liq to'plamiga ega bo'lgan anonim usullar. Yopiqlar Java SE 8 ichiga kiritilgan [1]. Ushbu yopilishlar, C # vakili sifatida, berilgan doiradagi barcha mahalliy o'zgaruvchilarga to'liq kirish huquqiga ega, va faqat oxirgi so'z bilan belgilangan o'zgaruvchiga kirish huquqiga ega emas (anonim joylashtirilgan sinflar kabi). Ortiqcha yuklash operatorlari [tahrir | kodni tahrirlash] C # tarkibiga ortiqcha yuklash va C ++ dasturchilariga tanish bo'lgan foydalanuvchi tomonidan aniqlangan televizion eshittirish kiradi. C # mantiqiy yaxlitlikni ta'minlaydigan ba'zi cheklovlar bilan qo'llab-quvvatlanadi, ular ehtiyotkorlik bilan ishlatilganda kodni yanada ixcham va o'qishga imkon beradi. Uni suiiste'mol qilmaslik va tilning soddaligini saqlab qolish uchun Java ortiqcha yuklash operatsiyalarini o'z ichiga olmaydi [12] [13] [14]. Xususiyatlari [tahrirlash | kodni tahrirlash] C # "xususiyatlar" tushunchasini qo'llab-quvvatlaydi - maydonning qiymatlarini olish va yozish usullarini yaratish orqali to'liq boshqariladigan kirish ta'minlanadigan sinfning soxta maydonlari. Mulkni tavsiflash get va set konstruktsiyalari yordamida amalga oshiriladi. Java-da bunday tushuncha yo'q [15] (garchi uni an'anaviy usullardan foydalangan holda amalga oshirish uchun hech qanday cheklovlar mavjud emas). C # shuningdek, indekslar deb ataladigan narsalar ham kiradi, ularni operatsiya haddan tashqari yuklanishining alohida holati (C ++ ichida operator [[haddan tashqari yuklash] ga o'xshash) yoki parametrlangan xususiyat deb hisoblash mumkin. Indeksator - bu [] deb nomlangan xususiyat bo'lib, u bir yoki bir nechta parametrlarga (indekslarga) ega bo'lishi mumkin va indekslar har qanday turda bo'lishi mumkin. Bu sizga misollarni massiv / xarita kabi tutadigan sinflarni yaratishga imkon beradi: Xususiyatlari [tahrirlash | kodni tahrirlash] C # "xususiyatlar" tushunchasini qo'llab-quvvatlaydi - maydonning qiymatlarini olish va yozish usullarini yaratish orqali to'liq boshqariladigan kirish ta'minlanadigan sinfning soxta maydonlari. Mulkni tavsiflash get va set konstruktsiyalari yordamida amalga oshiriladi. Java-da bunday tushuncha yo'q [15] (garchi uni an'anaviy usullardan foydalangan holda amalga oshirish uchun hech qanday cheklovlar mavjud emas). C # shuningdek, indekslar deb ataladigan narsalar ham kiradi, ularni operatsiya haddan tashqari yuklanishining alohida holati (C ++ ichida operator [[haddan tashqari yuklash] ga o'xshash) yoki parametrlangan xususiyat deb hisoblash mumkin. Indeksator - bu [] deb nomlangan xususiyat bo'lib, u bir yoki bir nechta parametrlarga (indekslarga) ega bo'lishi mumkin va indekslar har qanday turda bo'lishi mumkin. Bu sizga misollarni massiv / xarita kabi tutadigan sinflarni yaratishga imkon beradi:myList[4] = 5; string name = xmlNode.Attributes["name"]; orders = customerMap[theCustomer]; Xususiyatlardan foydalanish ba'zi taniqli dasturchilar tomonidan ma'qullanmagan. Xususan, Jeffri Richter shunday yozadi: "Shaxsan men xususiyatlarni yoqtirmayman va agar ular Microsoft .NET Framework va tegishli dasturlash tillaridan o'chirilsa, xursand bo'lardim. Sababi shundaki, xususiyatlar maydonlarga o'xshaydi, aslida usul. "[16] C # umumiy nomlash to'g'risidagi konventsiyaga binoan, mulk nomlari katta harf bilan boshlanadigan maydonlardan vizual ravishda farq qiladi. Shartli kompilyatsiya [tahrir | kodni tahrirlash] C #, Java-dan farqli o'laroq, preprosessor ko'rsatmalaridan foydalanib shartli ravishda kompilyatsiya qilishni qo'llab-quvvatlaydi. Bundan tashqari, u shartli atributga ega, ya'ni belgilangan usul faqat kompilyatsiya doimiysi aniqlanganda chaqiriladi. Shu tarzda siz kodga, masalan, tasdiqlash tekshiruvlarini kiritishingiz mumkin, ular faqat DEBUG doimiyligi aniqlanganda disk raskadrovka versiyasida ishlaydi. .NET standart kutubxonasida bu Debug.Assert () usuli. Java 1.4 va undan keyingi versiyalari ish vaqtiga kiritilgan taxminlarni tekshirish imkoniyatini o'z ichiga oladi. Bundan tashqari, agar doimiy sharoitga ega bo'lgan konstruktsiyalar kompilyatsiya bosqichida o'rnatilishi mumkin bo'lsa. Java uchun uchinchi tomon protsessorlari mavjud, ular asosan mobil qurilmalar uchun dasturlarni ishlab chiqishda qo'llaniladi. Ismlar, yig'ilishlar, paketlar [tahrir | kodni tahrirlash] Java va C # -dagi plaginlar shunga o'xshash tarzda ulanadi. Java-da, C # -dan foydalanib, import kalit so'z ishlatiladi. Download 435.43 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling