Тізімдер

Foreach оператордың көмегімен итерацяны оның элементінің санының қажетінсіз коллекция элементімен орындауға болады. Loreach операторы нөмірлеуге қолданылады(enumerator).6.7 суретте Loreach шақырылған және коллекция арасындағы қарым қатынас көрсетілген.GetEnumerator()-дыңкөмегімен IEnume rable интерфейсі арқылы массив пен коллекция құрылады.

Интерфейс IEnumerator

To reach әдісі IEnumerator интерфейс әдістері үшін қадамның барлық элементтеріне қолданылады. Бұл интерфейстің толық нұсқасы IEnumerator <T>, IDisposable интерфейсінің жалғасы,сондықтан нөмірлеуші үшін көшірілген ресурстарды нөмірлеу үшін Dispose әдісін анықтайды.

Енді жиынтық және игерушілік операторы foreach итерациясынның мүмкіндіктерін қарастырамыз:

Public void HelloWorld()

{var helloCollection=new HelloCollection();

Foreach(string s in helloCollection)

{Console.WriteLine(s);

} }

Блоктағы итератор компилятор yield типін түсіндіреді,соңынан жылдам қосады,фрагменттегі кодтың қалай екенін көрсетеді.Yield типі шындығында IЕnumerator және IDisposable интерфейс әдістерінің құрылымы.Мысалда біз yield типінің ішкі классы Enuterator екенін көреміз.GetEnuterator әдісі кластарды құрады және yield типін қайтарады. Yield типінің ішінде уақытынша state итераторын анықтайды және әрқайсысын өзгертеді, MoveNext() әдісін шақырған кезімізде. MoveNext() Әдісімен итератордағы блоктың кодынның мағынасын орнатады және объектісінің құрлымын қайтарады,айқындамаға тәуелді болады.

Итерацияның түрлі әдістерін жиынтықта қолдану

Көлемді және шындық мысалды жоғарыда келтіргеніміздей yield операторы арқылы кластарды жеңіл әрі жиынтықтағы итерация әдісімен орындау оңайырақ. MusicTitles класы итерацияны GetEnumerator() әдісі арқылы шақырады, Reverse () әдісі болса қайтадан ретке келтіреді және Subset () әдісі көптік итерацияларға көмектеседі.


18. Кортеждер. Құрылымдық салыстыру.

Массивтер бір типті объектілерді жүйелесе, кортеждер әр түрлі типті объектілерді жүйелей алады..NET 4-те кортеждердің фабрикасы қызметін атқаратын сегіз Tuple жалпылама классы және Tuple бір статистикалық классы анықталған. Әр түрлі мөлшерлі элементті қолдайтын Tuple жалпылама класстары әр түрлі болады: Tuple<T1> бір элементті, Tuple<T1, T2> екі элементтен тұрады.

Divide() методы кортеждің екі мүшесінің қайтуын көрсетеді - Tuple<int,int>. Жалпылама класстың параметрі мүшелердің типін анықтайды, біздің жағдайда екеуі де бүтін сан. Кортеж Tuple статистикалық классының Create() статистикалық методымен жасалған. Create() методының жалпылама параметрлері кортеждің жасалынып жатқан экземплярының типін анықтайды. Қайта жасалынған кортеж бөлінгіш нәтижесін қайтару үшін result және reminder айнымалыларымен инициализацияланады.

Public static<int,int> Divide(int dividend, int divisor)

{

Int result=dividend/divisor;

Int reminder=dividend%divisor;

Return Tuple.Create<int,int>(result,reminder);

}

Келесі кодта Divide() методын шақыру көрсеілген. Кортеж элементтері Item1 және Item2 ерекшеліктері арқылы ғана қолжетімді.

Var result=Divide(5,2);

Console.WriteLine(“resultat delenia: {0}, ostatok:{1}”,

Result.Item1, result.Item2);

Кортежге енгізілетін элемент саны сегізден көп болған жағдайда сегіз параметрлі Tuple классының анықтамасын қолдануға болады. Кортеждің өзі берілетін соңғы параметр TRest деп аталады. Осылайша параметр санына шектеусіз кортеждер жасауға болады.

Бұл функционалдылықты көрсету үшін келесідей код жазамыз:

Public class Tuple<T1,T2,T3,T5,T6,T7,TRest>

Мұнда шаблонның соңғы параметрі кортеждің типі болып табылады, осылайша кез келген көлемді кортеж жасауға болады:

Var tuple=Tuple.create<string,string,string,int,int,int,double,

Tule<int,int>>(“Stephanie”,”Alina”,”Nagel”,2009,6,2,1,37,

Tuple.create<int,int>(52,3490));

Құрылымдық салыстыру

Массивтер сияқты кортеждер де IStructuralEquatable және IStructuralComparable интерфейстерін жүзеге асырады. Бұл интерфейстер.NET 4-те пайда болды және сілтемелерді ғана емес, сондайақ оның ішіндегілерді де салыстыруға мүмкіндік береді. Интерфейс айқын жүзеге асырылады, сондықтан оны қолдану кезінде массивтер мен кортеждердің келуін іске асыру керек. IstructuralEquatable екі кортеж немесе кортеждің ішіндегілер бірдей ма соны анықтайды, ал IstructuralComparable кортеждер мен массивтерді сорттау үшін пайдаланылады. КЕлесі мысалда IstructuralEquatableдың қолданылуын көрсететін, lEquatable интерфейсі іске асырылатын Person классы құрылған. Бұл интерфейс FirstName және LastNAme ерекшеліктерін салыстыратын Equals() типталған методын анықтайды:

Төменде Person элементтерінің екі массиві құрылады. Екеуі де бірдей Person объектісінен тұрады, ол janet есімді айнымалы және ішіндегі әр түрлі болатын Person екі түрлі объектісінен тұрады.!= салыстыру операциясы true қайтарады, себебі бұлар persons1 және persons2 екі айнымалысы сілтелінетін екі түрлі массив. Equals() методы бірпараметрлі және Array классымен қайта анықталатын болғандықтан, == операциясымен де осындай жағдай болады, сілтемелерді салыстыранда олар сәйкес келмейді.

Equals() методын шақырғанда, IstructuralEquatable анықтауды қабылдайтын object типті бірінші параметрі және екінші IstructuralComparable типті параметр салыстыру қалай жүретіні туралы анықтайтынын көрсетеді. IstructuralComparable іске асырылуы EqualityComparer<T> классы бойынша көрсетіледі. Онда IEquatable іске асыралама жоқ па тексеру жүргізіледі де, IEquatable.Equals() шақырылады. Егер тип IEquatable іске асырмаса, онда салыстыру үшін object класының Equals() методы шақырылады.

Person классы IEquatable<Person> іске асырады, онда объектілер салыстырылады және массивтер шынымен де бірдей объектілерден тұратындығы анықталады:

Енді осыларды кортеждерді енгізу арқылы қалай жасауға болатыны жайлы көрсетіледі. Төменде бірдей объектілі кортеждердің екі экземпляры құрылады. Әрине T1 және t2 сілтемелері екі түрлі объектіге сілтегендіктен!= салыстыру операциясы true қайтарады:

Tuple<> классы Equals() екі методын ұсынады: біріншісі object класынан параметр негізінде Object базалық класынан іске асыруды қайта анықтайтын, екнішісі object және IEqualityComparer параметрлі IStructuralEqualityComparer интерфейсі арқылы анықталған. Көрсетілгендей басқа кортеж бірінші методқа берілуі мүмкін. Осылайша кортеждегі әрбір элемент Object.Equals() методын шақыру негізінде салыстырылады. Егер әрбір элементке true қайтарылатын болса, Equals() методының соңғы нәтижесі де true болады:

Сондайақ төменде көрсетілген TupleComparer классының мысалында IEqualityComparer арнайы интерфейсін құруға болады. Бұл класста IEqualityComparer интерфейстің екі метод іске асыралған: Equals() және GetHashCOde().

IEqualityComparer интерфейстің Equals() методын іске асыру үшін new модификаторы немесе айқын емес интерфейсті іске асыруы қажет, ссебебі Object базалық класы екі параметрлі Equals() статистикалық методын анықтайды.


19. C#-тағы операциялар. Мәндер типімен және сілтемелермен жұмыс жасау кезіндегі эквиваленттілік идеясы.

C# тілінде орындалатын операциялар:

Категориялар Операциялар
Арифметикалық + - * / %
Логикалық & | ^ ~ && ||!
Өріс конкотенциясы +
Инкремент және декремент ++ --
Биттік жылжыту << >>
Салыстыру ==!= <> <= =>
Меншіктеу = += -= *= /= %= &= |= ^= <<= >>=
Мүшеге қол жетімділік .
Индексациялау []
Келтіру ()
Объект құру New
Тип туралы ақпарат Size of tupe as

C# операцияларын қолданған кезде абай болатын жағдайлар болады. C# тілінде басқаларда сияқты меншіктеу (=) және салыстыру(==) операциялары орындалады. Мысалы келесі оператор х үшке тең дегенді білдіреді:

x=3;

енді егер сіз хті салыстырғыңыз келсе, онда сіз қос теңдік == белгісін қолдануыңыз керек:

If (x==3)

{

}

C# тілінде жұмыс істеуді жеңілдету мақсатында операцияларды қысқарту қолданылады:

Шартты операциялар

Шартты операторлар (?:) немесе тернарлы деп те аталады, ол if…else операторының қысқартылған түрі. Ол үш операндпен жұмыс істейді. Бұл операция есептеп шығарып, бір жауапты таңдайды. Шарт дұрыс немесе дұрыс еместігін анықтайды.

Chiced unChiced операциялары. Бұл операторлар қателіктің жоқ екендігін тексеруге арналған операциялар болып табылады.

Is операциясы объект берілген типке сәйкестігін тексереді.

as операциясы Сілтемелі айнымалар типтерін қайта жасау үшін арналған операция.


20. Мәліметтердің қарапайым типтерін өзара өзгерту. Қаптама(boxing) құралдарымен мәндер типін сілтеме типке өзгерту.

Қаптама – бұл мән-р типін сілтеме типке өзгерту. Төмендегі мысалда int айнымалысын object айн-на қаптаймыз:

1.int x = 9;

2.

3.object obj = x;// int типі-ң қаптамасы

Оның жүзеге асуы оңай. Console.WriteLine() шақырғанда компилятор start –ты object-ке ауыстыру амалын іздейді, с/бі WriteLine() үшін 2-ші параметр object болу керек. Сілтеме типке (яғни класқа) бұл өзгеру оңай, с/бі object – қалған клас-р үшін базалық класс. Компилятор жай ғана object сілтемесіне сияқты класс экхемплярына көрсететін сілтемені жібереді.

Алайда, мән-р типіне сілтеу эквиваленті жоқ, сон-тан компилятор Point үшін сілтеме тип-ң "қаптамасын" құрады, оны Point типі-ң құрамдас экземпляры қылып белгідейді ж/е оған Point-ң мәнін көшіреді. Қаптама үйіндіде(heap) орналасады. Енді біз сілтеме типпен ж/е онымен object –пен сияқты жұмыс жасаймыз. Кейін бұл сілтеме WriteLine()-ға жіберіледі, ал ол Point қапталған айнымалысы үшін ToString()фунциясын шақырады ж/е консольға келесі шығады:

Start: (5, 5)

Мән-р типі object талап етілетін жерлерде автоматты түрде қаптама жүреді.

Қаплатған айн-лы мән-р типәне айналу үшін шешу (распаковка (unboxing)) қолданылады.

int v = 123;

object o = v; // int айн-ң сілтеме типке айналыуы ссылочный тип

int v2 = (int) o; // нәт-де int-ті алу шешуі

Объекете v мәні меншіктелген кезде бүтін мән автоматты түрде қапталады. Келесі жолда int қайта орнына келеді. Бұл суретте көрсетілген:.

Орнына келуден алынған айн-лы типі қапталған типке сәйкес келу керек. Басқа типке өзгеру автоматты түрде орындалмайды (тіпті үйлесімді тип болса да):

object o = 15;

short s = (short) o; // қате: short құрамында о жоқ

short t = (short)(int) o; // бұл жол жұмыс істейді


21. Сілтеме типтерді келтіру арқылы өзгерту. Стандартты операцияларды қолданушы типтер үшін асыра жүктеу.

Сілтеме типтерді келтіру арқылы өзгерту

C#-та тип компиляция уақытында анықталатындықтан, айнымалыны жариялағаннан кейін ол тағы да жариялана алмайды немесе басқа типті сақтауға қолданыла алмайды егер ол айнымалыда құрылмаса. Мысалы, бүтін санның туынды жолға айналуы мүмкін емес. Сондықтан, i айнымалыны бүтін сан ретінде жариялағаннан кейін, мысалда көрсетілгендей оған ‘Hello’ жолын меншіктеуге болмайды

C#

int i;

i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"

Кейде мәнді айнымалыға немесе басқа типтің әдісінің параметріне көшіру керек болады. Мысалы, параметрі double типті болатын әдіске беру керек айнымалы болуы мүмкін. Немесе, интерфейс типі айнымалысына класс айнымалысын меншіктеу керек. Мұндай операциялар типтердің өзгеруі деп аталады. C#-та келесі өзгерулерді орындауға болады:

· Анық емес өзгерулер. Ешқандай арнайы синтаксистің қажеті жоқ, өйткені өзгеру типтерге қауіпсіз және деректер жоғалмайды. Бұған кішіден үлкен бүтін типке өзгеруі мысал бола алады, және туынды кластардан базалық кластарға өзгеру.

· Анық өзгерулер. Анық өзгерулерге келтіру операторы қажет.Келтіру, өзгеру кезінде мәліметтің жоғалуы мүмкін болғасын қажет немесе өзгеру басқа қателіктерге кезіккенде керек.

· Қолданушылық өзгертулер. Қолданушылық өзгертулер, қолданушылық өзгертулер арасында анық немесе анық емес өзгертулерді анықтауға болатын арнайы әдістермен орындалады.

· Қосымша кластардың көмегімен өзгертулер. Сәйкес емес типтер арасында өзгертулер үшін, мысалы бүтін сандар және System.DateTime обьектісі, немесе он алтылық жолдар мен байттық массивтер, System.BitConverter класын қолдануға болады.

Стандартты операцияларды қолданушы типтер үшін асыра жүктеу.

Операцияны қайта жүктеу идеясы сіз әрқашан әдістерді шақырумен және обьект қасиеттерімен шектелмейді. Кейде өлшемдерді қосу немесе логикалық операцияларды жүзеге асуру керек болады. математикалық матрицалар көрсететін анықталған класс бар деп қарастырайық.

Matrix a, b, c;

Matrix d=c*(a+b);

Операциялардың жұмыс істеуі

Операцияларды қайта жүктеуді түсіну үшін компилятор операцияны кодта кездестірген кезде не болып жатқанын ойлану керек.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: