- •1. .Net архитектурасы.Net-ке бағытталған кодтын орындалуы және компиляциясы. Microsoft Intermediate Language (msil) тілінің артықшылықтары.
- •3. С# программалау тілінің негізі. Айнымалыларды жариялау. Айнымалыларды инициялизациялау олардың көріну облысы.
- •5. Консольді енгізу-шығару үшін System.Console-ді пайдалану. Процессор директивтері.
- •6. Объекті/ ж/е типтер. Структура және кластардың өзара айырмашылық/ы. Класс мүшелері.
- •8. Конструкторлар және статикалық конструкторлар. Тек оқуға рұқсат етілген өріс.
- •9. Жекеленген кластар. Статикалық кластар. Object класы.
- •10. Мұралау. Мұралау типі. Іске асыруды (реализация) мұралау.
- •11. Мұралау. Рұқсат модификаторлары. Интерфейстер.
- •12. Жалпылау. Жалпылауға шолу. Жалпыланған кластар құру.
- •13. Жалпыланған кластар құралдары. Жалпыланған интерфейстер.
- •14. Жалпыланған структуралар. Жалпыланған әдістер.
- •15. Массивтер және кортеждер. Жай массивтер. Көпөлшемді массивтер.
- •16. Тісті массивтер. Array класы.
- •17. Массивтер параметр ретінде. Тізім бойынша санау.
- •18. Кортеждер. Құрылымдық салыстыру.
- •20. Мәліметтердің қарапайым типтерін өзара өзгерту. Қаптама(boxing) құралдарымен мәндер типін сілтеме типке өзгерту.
- •21. Сілтеме типтерді келтіру арқылы өзгерту. Стандартты операцияларды қолданушы типтер үшін асыра жүктеу.
- •Vector структурасы
- •22. Келтіру операцияларын қолданушы типтерге қосу.
- •23. Делегаттар. Лямбда-өрнектер. Уақиғалар.
- •24. Сөз тіркесін құру. Жүйелі өрнектер.
- •25. Сөз тіркесін құру. Форматтаушы өрнектер.
- •26.Интерфейстер және коллекциялар типтері. Тізім, кезек және стектермен жұмыс.
- •27. Сортталған және жүйелі тізімдермен жұмыс. Жиындар мен сөздікті пайдалану.
- •29. Қателер және ерекшеліктер. Ерекшеліктерді өңдеу.
- •30. .Net ядросы. Деректер базасына қосылу. Команданы орындау.
29. Қателер және ерекшеліктер. Ерекшеліктерді өңдеу.
Қателер әрқашан да қосымшаны кодтайтын программисттің қателігінен болмайды. Кейде қосымша соңғы пайдаланушының іс-әрекетінен қате шығарады н/е код орындалатын ортаның шақыруымен болады. Бірақ кез келген жағдайда сіз өзініздің қосымшаныздың қате шығаруы мүмкін екенін есте сақтау керек ж/е соған байл-ты шаралар қолдану керек.
.NETFramework – те қателерді жою жүйесі қарастырылған. C# тілінің қателерді жою механизмі қателерді туындататын кодтан бөлек жазуға мүмкіндік береді. Сіздің жазған кодыңыздың қаншалықты жақсы жазылғанына қарамастан құрылған программалар қатенің кез келген түрін жоя білуі керек. Мысалы, кейбір қиын процессті жасау барысында код өзінің файлды оқуға құқығы жоқ екенін біледі, н/е жіберу барысында байланыс үзіледі. Мұндай жағдайда метод тек қана қате болғаны жайында код шығарғаны жеткіліксіз. Тіпті кейде қате шыққанға дейін 15-20 ішкі методтар шақырылған болуы мүмкін. Қате шығармай шығу үшін осы 15-20 шақырулардан “аттап” шығуымызға тура келеді. С# тілінде осындай жағдайларды болдырмау үшін өте пайдалы құрал бар, яғни дербес жағдайлар механизмі.
Ерекше жағдайды генерацияламастан бұрын оның типі дұрыс таңдалуы керек.System. Exseption класы әрқашан қол жетімді,оның мақсаты – базалық кластарға жұмыс істеу: берілген кластың данасын ерекше жағдай ретінде құру программалауда қателік болып табылады,себебі ол қате жағдай туралы еш мәлімет алып жүрмейді. Оның орнына .Net Framework ортасы System.Exception –нан мұраланған кластың көптеген басқа ерекше жағдайларына ие.Оның әрқайсысы арнайы анықталған жағдайға сай, және де жеке класты еркін анықтасақ болады. Бұның идеясы ,берілген жағдайға нақтырақ келетін , ерекше жағдай класының данасын активтілей отыра ерекше жағдайға көбірек мәлімет беру.
Біздің қолданулышылық ерекшеліктерімізді алатын SolicitColdCall мысалының Main() әдісінен бастаймыз. Назар аударыңыз, бізге System.IO атаулар кеңістігінің файлдармен жұмыс істейтін классатарымен жұмыс істеуге тура келеді және де System атаулар кеңістігінің жалпы класстарымен де жұмыс істейміз.
Using System
using System.IO
namespaceWrox.ProCSharp.AdvancedCSharp
{ classMainEntryPoint
{ static void Main()
{ Console.Write( “Файл атын еңгізіңіз,”+ “шақыруға қажетті тұлғалар тізімін>”);
string filename =Console.Readline();
ColdCallFileReaderpeopleToRing=new ColdCallFileReader();
try
{ peopleToRing.Open(fileName);
for(inti=0;i<peopleToRing.NPeopleToRing;i++)
{ peopleToRing.ProcessNextPerson(); }
Console.WriteLine(“ Барлық абонеттер дұрыс өңделді”)
}
catch(FileNotFoundException ex)
{ Console.WriteLine(“ {0} ондай файл жоқ”,fileName); }
catch(ColdCallFileFormatException ex)
{ Console.WriteLine(“{0} файлы бүлінген”, fileName);
ConsoleWriteLine(“ақаудың себебі:{0}”, ex.Message);
if (ex.InnerException !=null)
{ Colnsole.WriteLine(“ішкі ерекшелік : {0}”, ex inner Exception.Message); }
}
catch(Exception ex)
{ Console.WriteLine(“ерешелік орын алды:\n”+ex.Message); }
finally
{ peopleToRing.Dispose(); }
Console.ReadLine();
}
}
Бұл код қарапайым файлдан аттарды өңдегеннен қарағанда көбірек пайда әкеледі. Барлығы қолданушыға файл аты жайлы сұраныс жібеуден басталады. Содан кейін файлды оқуды басқаратын ColdCallFileReader класының көшірмесі құрылады. Назар аударыңыз, бұл әрекет try блогынан сыртта жасалады, себебі мұнда айнымалылар catch және finally блоктарында қажет болады және егер оларды try блогының ішінде жариаласа қисық жақшаны жабу кезінде айнымалылырдың әрекет ету облысы тоқтап қалады.
Try блогында файл ашылады да осы файлда сақталған адамдардың тізімі негізінде цикл орындалады. ColdCallFileReader.ProcessnextPerson() келесі абонеттің атын оқиды және көрсетеді, ал ColdCallFileReader.NPeopleToRing файлда қанша та сақталуға тиістігін хабарлайды. Кодта 3 блок бар: catch- біреуіFileNotFoundException үшін, екіншісі ColdCallFileFormatException үшін және барлық қалған ерекшеліктерді алу үшін .NET.
FileNotFoundException ерекшелігі туындаған жағдайда хабларлама көрсетіледі. Назар аударыңыз бұл catch блогының өзінде ерекшелік көшірмесі(экземпляр) қолданылмайды. Бұл блок жай ғана біздің қолданбамыздың қолданушыға деген жолдастығын көрсетеді. Ерекшелік объектілері әдетте құрушыларға пайдасы тиетін техникалық ақпаратты сақтайды, бірақ бұны соңғы қолданушыға көрсетіп қажеті жоқ. Сондықтан осы жағдайда біз өзіміздің қарапайымдатылған хабарламамызды құрамыз.
ColdCallFileFormatException өңдегіші еңгізілген ерекшелік жайлы толық техникалық ақпаратты қалай беруге болатыны жайлы көрсетілімдерді береді.
Соңында барлық қалған бірыңғай ерекшеліктерді ала отырып біз қолданушыға жолдастық хабарлама көрсетеміз.
Finally блогы ресурстарды тазалайды. Бұл жағдайда ол дегеніміз ашылған файлды жабу ColdCallFileReader.Dispose() әдісімен орындалады.
Қолданушының ерекшеліктерін ояту
Енді файлды оқитын және қолданушының ерекшеліктерін генрациялайтын ColdCallFileReader класының анықталуына қарайық. Бұл класс сыртқы файлдармен байланысты қолдайтындықтан оның дұрыс түрде жабылуы қамтамасыз етілуі тиіс. Сондықтан бұл класты IDisposable интерфесінен мұралайық. Алғашында бірнеше айнымалы жариялайық:
Class ColdCallFileReader: IDisposable
{
FileStreamfs;
StreamReadersr;
uintnPeopleToRing;
boolisDisposed=false;
boolisOpen=false;
FileStreamжәне StreamReaderSystem.Ioатаулар кеңістігінде орналасады және базалық класстар болып табылады және файлды оқуға қолданылады. FileStream файлға алғашқы рет қосылуға рұқсат беретін қызмет істесе, StreamReader тексттік файлдарды оқуға арналған және ReadLine() әдісін орындайды, ал ReadLine() әдісі файлдағы жолды оқиды. Толығырақ StreamReader жайлы 29 бөлімде айтамыз.
isDisposal өрісі Dispose() әдісі шақырылғанын немесе шақырылмағанын көрсетеді. ColdCallFileReader класы Dispose() әдісі шақырылған жайғдайда жасалса онда оған екінші рет байланысты ашып объектіні қолдануға рұқсат берілмейді.
Файлды ашу процессі және оның бірінші жолын оқу процессі Open() әдісі арқылы жасалады.
public void Open(string file Name)
{
if(isDisposed)
{ throw new ObjectDisposedException(“peopleToRing”); }
fs= new FileStream(filename, fileMode.Open);
sr= new StreamReader(fs);
try
{ stringfirstLine=sr.ReadLine();
nPeopleToRing=uint.Parse(firstLine);
isOpen=true;
}
catch (FormatException ex)
{ throw new ColdCallFileFormatException(“алғашқы жолда сан жоқ”,ex); }
}
Бұл әдіс алдымен өзінің дұрыс жолмен шақырылғанын тексереді және егер ол олай болмаған жағдайда алдын-ала анықталып қойған ObjectDisposedException ерекшелігін шақырады.Open() әдісі isDisposedөрісін Dispose() бұған дейін шақырылмағанына тексереді. Dispose()-ді шақыру клиент жұмысты аяқтағанын білдіргендіктен одан кейін жаңа файлдық байланысты ашу қателік ретінде қабылданады.
Ары қарай әдісте қатысатын 2 try блогының біреуі ашылады. Оның біріншісінің қызметі – кез келген қателіктерді ұстау, нәтижесінде файлдың бірінші жолында бүтін сан болмайды. Егер мұндай проблема туындап жатса .NET орындаушы ортасы FormatException ерекшелігін шақырады. Бұл ерекшелікті біз аламыз да өңдейміз, нәтижесінде ол бізге қателік файдың фоматында екенін хабарлайды. Назар аударыңыз, бұл жерде System.FormatException мәліметтердің базалық типінің проблемасын білдіреді. Жаңадан генерацияланған ерекшелік try сыртқы блогымен алынады. Бұл жерде ешқандай тазалаудың керегі жоқ болғандықтан finally блогыныңда қажеті жоқ.
Егер барлық өрістер дұрыс болса, isOpen өрісінің мағынасы true болады, бұл дегеніміз дұрыс файлдық байланыс бар екендігін білдіреді. ProcessNextPerson() әдісінде де try блогы бар.
public void ProcessNextPerson()
{
if (isDisposed)
{ throw new ObjectDisposedException(“peopleToRing”); }
if(!isOpen)
{ throw new UnexpectedException(“ашылмаған файлға қатынау ”); }
try
{
string name;
name=sr.ReadLine ();
if(name==null)
{ throw new SalesSpy Found Exception (“Аттар саны жеткіліксіз”); }
if (name[0]==’B’)
{ throw new SalesSpyFoundException(name); }
Console.WriteLine(name);
}
catch(SalesSpyFoundException ex)
{ Console.WriteLine(ex.Message); }
finally
{
}
}
Бұл жерде файлмен 2 проблема туындауы мүмкін. Біріншісі – біз кезектегі бір атты оқып оның бәсекелестің тыңшысы екеніне көзіміз жетеді.Бұл жағдайда catch блогында өңделген ерекшелік шақырылады.Бұл ерекшелік циклдың ішінде орныдалып тұрғандықтан бұл әрекет Main() – да да орындала алатынын білдіреді және барлық келесі аттар өңделеді.
