Шектеулер

Егер жалпыланған класқа жалпыланған типтен кейбір әдістерді шақыру керек болса, онда шектеулер қосу керек. DocumentManager<T> жағдайында барлық құжаттардың тақырыптары DisplayAllDocuments() әдісінде көріну керек. Document класы Title және Content құрамдарымен Idocument интерфейсін жүзеге асырады.

public interface Idocument

{ string Title {get; set;}

string Content{get; set;}

}

public class Document: Idocument{

public Document()

{

}

public Document (string title, string content)

{ this.title=title;

this.content=content; }

public string Title{get;set;}

public string Content{get; set;}

}

Жалпылаулар қолдайтын шектеулер

Шектеу Сипатталуы
Where T: struct Т типі мәндер типі болуы керек
Where T: class Т типі сілтемелі болуы керек
Where T: IFoo Т типі Ifoo интерфейсін жүзеге асыруы керек
Where T: Foo Т типі Foo-ден мұралануы керек
Where T: new () Ттипі үндеместік бойынша конструкторы болуы керек деп көрсететін конструктор шектеуі
Where T: T2 Т1 типі жалпыланған Т2 типінен мұраланатынын көрсету

Мұралану

Жалпыланған тип жалпыланған интерфейсті жүзеге асыра алады. Жалпыланған класс жалпыланған негізгі кластан мұралануы мүмкін:

public class Base<T>

{

}

public class Derived<T>: Base <T>

{

}

Статикалық мүшелер

Жалпыланған кластардың статикалық мүшелері тек бір класс экземплярымен бөлінеді. мысалы, StaticDemo<T> статикалық х аймағын қамтиды:

public class StaticDemo<T>

{ public static int x; }

Екі статикалық аймақ жиынтығы болады:

StaticDemo<string>.x=4;

StaticDemo<int>.x=5;

Console.WriteLine(StaticDemo<string>.x); // 4-ті жазады

Жалпыланған интерфейстер

Жалпылауды қолдана отырып, әдістерді жалпыланған параметрлермен жариялайтын интерфейстерді анықтауға болады..NET-те әр түрлі көріністерге көптеген жалпыланған интерфейстер ұсынылады. Мысалы, Icomparable<T>, Icollection<T> және IExtensibleObject<T>. Icomparable<in T> интерфейсі жалпыланған типте құрылған:

public interface Icomparable<in T>

{ int CompareTo (T other); }

Жалпыланбаған ескі Icompareable интерфейсі CompareTo() әдісінде обьектіні талап етеді. LastName қасиеттерін қолдану:

public class Person: Icomparable

{ public int CompareTo(object obj)

{ Person other=obj as Person;

return this. lastname.CompareTo(other.LastName); }

// …

Коварианттылық және контраварианттылық

.NET 4 версиясы шыққанға дейін жалпыланған интерфейстер инвариантты болды..NET 4-те жалпыланған интерфейстерге және жалпыланған делегаттардың кеңеюінде – коварианттылық және контраварианттылық пайда бодлы. Бұл түсініктер аргумент типтерінің құрылуына және қайтарылатын типтерге қатысты.

.NET-те параметрлер типтері коварианттылы.

Жалпыланған интерфейстердің коварианттылығы

Жалпыланған интерфейс ковариантты, егер жалпыланған тип out кілттік сөзімен болса. Бұл, Т типі қайтарылу ретінде ғана рұқсат етілгендігін білдіреді.Iindex интерфейс Т типімен коварианттылы.

pubic interface Iindex<out T>

{ T this [int index] {get;}

int Count {get;}

}

Жалпыланған интерфейстердің контраварианттылығы

Жалпыланған интерфейс контраварианттылы, егер жалпыланған тип in сөзімен болса. Осылай интерфейс Т жалпыланған типін өз әдістеріне кіріс ретінде тағайындай алады:

public interface Idisplay<in T>

{ void Show (T item); }


14. Жалпыланған структуралар. Жалпыланған әдістер.

Жалпыланған структуралар жалпыланған класстарға өте ұқсас боп келеді.Бірақ Мұралану қасиеті болмайды.

Nullable<T>. Net Framework те жалпыланған структуралардың мысалы боп табылад.Деректер қорында және программалау тілінде сан мінездемесі бойынша әртүрлі боп келедіДеректер қорында null бола алады.C # та сан null бола алмайды.

Nullable<T> структурасы Жалпыланған Т типі структура болу керек шегін анықтайды.Т типіне жалғыз толлықтауыш боп,анықталған Nullable<T>,hasvalue бульдік қатарынан тұрады,ол орнатылған мән бе әлде null –ға тең екенін анықтайды. Жалпыланған структуралар hasvalue және value типін оқу үшін қолжетімділікті анықтайды.Және де бірнеше операцияларды анықтайды. Nullable<T> -ны Т –ға келтіру операциясының жүктелуі анық,ол қателерді hasvalue false–қа тең болса,өңдей алады.Nullable<T> -ны Т –ға келтіру операциясының жүктелуі анық емес,себібі ол әрқашанда ойдағыдай:

public struct Nullable<T>

where T:struct

{ public Nullable(T value)

{ this.hasvalue=True;

this.value=value;

}

private bool hasvalue;

public bool Hasvalue

{

get

{return hasvalue;}}

private T vaue;

public T Value

{

get

if(!hasvalue)

{throw new InvalidOperation (“no value”);}

return value;}}

public static explicit operator T(Nullable<T> value)

{return value.Value;}

public static implicit operator Nullable<T>(T value)

{return new Nullable<T>(value);}

Public overridge string ToString()

{if (!HasValue)

return String.Empty;

return this.value.Tostring();}}

Бұл мысалда, Nullable<T> көшірмесі Nullable<int> секілді құрылған.х айнымалысы енді int ретінде де қолдануға болады.Оған мағынасын меншіктеп кейбір есептерді шығаруда қолдануға болады.Мұндай әрекет Nullable<T> типіндегі операция арқасында мүмкін болды.

Жалпыланған әдістер.

Жалпыланған әдістерді жариялағанда, Жалпыланған типтер қолданылады. Жалпыланған әдістер жаллпыланбаған класс ішінде анықтала алады.

Swap <T> әдісі Т-ны жалпыланған тип ретінде анықтайды:

void swap <T>(ref T x,ref T y)

{t temp,temp=x;

temp =x;

x=y;

y=temp;}

жалпыланған әдіс нақты типтің жалпыланғанының орнына шақырылуы мүмкін:

int i=4;

int=5;

Swap <int >

(ref I,ref j)

Жалпыланған әдістің мысалы:

Төменде коллекцияға барлық элементтерді жинау есебі кетірілген.

Жалпыланған әдістердің мүмкіндігін бағалау үшін Account класын пайдаланамыз.Ол Name және Balance қасиеттерін қамтиды.

Public class Account

{ public string Name{ get;private set;}

Public decimal Balance {get;private set;}

Public Account (string name,Decial Balance)

{ this.Name=name;

This.Balance=balance;

}

Барлық есептер List <Account> есептеу тізіміне қосылады:

List <Account>:

Var accounts =newList <Account> ()

{new Account (“Christian”,1500),

new Account(“Stephane”,2200),

new Account (“Angela”,1800)};

15. Массивтер және кортеждер. Жай массивтер. Көпөлшемді массивтер.

Біртипті обьектілер жиынымен жұмыс істеу үшін коллекциялар және массивтер қолдануға болады. C # бағдарламасында массивтертерді хабарлау және қолдануы үшін арнайы ережелер қарастырылған. Бұл жерде массивтің ішіндегі элементтерді іріктеу және фильтрлеуде қолданылатын әдістерді көрсететін Array классы іске қосылады. Қайта санау (enoumerator) функциясы көмегімен массивтің барлық элементтері бойынша итерация жүргізуге болады. Сонымен қатар,.NET 4-те объектілер жиыны комбинациясы үшін қолданылатын Tuple (кортеж) жаңа типі пайда болды.

Қарапайым массивтер

Біртипті объектілер жиынымен жұмыс істеу барысында массивтерді қолдануға болады.

Массив – біртипті элементтердің жиынын құрайтын мәліметтер құрылымы.

Массивтің хабарлануы

Массив - соңынан тік жақшалар мен айнымалы аты қойылатын элементтердің типін анықтаумен хабарланады. Мысалы, толымды элементтер қолданылатын масситер келесі түрде беріледі.

int [] myArray;

Массивтің инициализациясы

Массив хабарлауынан кейін оның барлық элементтерін сақтайтын жад белгіленуі тиіс. Массив сілтемелі тип ретінде берілгендіктен, ол үшін жады үйіндіде жіктелуі тиіс. Бұл массивтегі элемент типі мен саны көрсетілетін new операциясы көмегімен жасалатын айнымалылар инициализациясымен орындалады. Массив мөлшерін келесі түрде жазуғa болады:

myArray = new int [4];

Осындай хабарлама мен инициализациядан кейін myArray айнымалысы үйінділерге жіктелген 4 толымды мәнге сілтеме жасайды. Массив мәндерін бірнеше жолда емес, тек бір жолда да көрсетуге және жариялауға болады:

Int [] myArray = new int [4];

Массив инициалтзаторы көмегімен массивтің әрбір элементіне мән беруге болады. Массив инициализаторы массив хабарланып болғанда емес, хабарлану барысында қолданылады.

Int []myArray = new int [4] {4, 7, 11, 2};

Егер сіз массив мәндерін тік жақша арқылы енгізсеңіз, онда сізге массив көлемін көрсетпесе де болады, себебі компилятор оны өзі анықтайды.

Int []myArray = new int {4, 7, 11, 2);

C # компиляторын қолдануда одан да қысқа форма бар. Массив хабарламасы мен мәндерін жүйелі жақша арқылы жазуға болады. Компиляторда реттелген код дәл алдынғыдай болады.

Int []myArray = {4, 7, 11, 2};

Массив элементтеріне рұқсат

Массив хабарланып инициализацияланғаннан кейін, оның элементтеріне индексатор (indexer) қолдануға болады. Массивтер тек қана бүтін санды индексаторларды қабылдайды.

Массивке рұқсат үшін элемент номері индексаторға жіберіледі. Индексатор бірінші элемент үшін әрдайым 0 санынан басталады. Индексаторға жібере алатын ең үлкен номер элементтердің жалпы қосындысынан 1-ді азайтқанға тең, себебі, номерлеу нольден басталған. Келесі мысалда myArray массиві төрт бүтін мәндермен хабарланып инициализациялануда. Элементтерге болады 0, 1, 2 және 3 индексатор мәндермен қолдануға болады.

int [] myArray = new int {4, 7, 11, 2};

int v1 = myArray [0]; //бірінші элементті оқу

int v2 = myArray [1]; //екінші элементті оқу.

myArray [3] = 44; // төртінші элементті өзгерту

Төменде келтірілгендей, массивтеггі элемент санын анықтау үшін Length қасиетін пайдалануға болады:

for = 0 (int i=0; i<myArray.Length; i++)

{ Console.WriteLine (myArray [i]); }

Массив барлық элементтер бойынша өтуде for операторының орнына foreach операторын қолдану керек:

foreach (int val in myArray)

{ Console.WriteLine (val); }

Көп өлшемді массивтер

Қарапайым массивтер (бір өлшемді жалғыз бүтін мәнмен индекстелінеді. Көпөлшемді массив деп екі не одан көп бүтін сандармен индекстелінеді. 6.3 суретте үш жол үш бағаннан тұратын екіөлшемді массивтің математикалық мағынасы көрсетілген. Бірінші жол 1, 2 және 3 мәніне ие, ал үшіншісі- 7, 8 және 9.

Екіөлшемді массивтің математикалық мағынасы

С# тілінде екі өлшемді массивті жариялау үшін тік жақшаладың ішіне үтір қою керек. Массив әрбір өлшем мөлшерлерән нұсқаумен белгіленеді(ранг деп те атайды). Енді индексатордағы екі санды көрсету арқылы массив элементін шақыруға болады:

int [,] twodim = new int [3, 3];

twodim [0, 0] = 1;

twodim [0, 1] = 2;

twodim [0, 2] = 3;

twodim [1, 0] = 4;

twodim [1, 1] = 5;

twodim [1, 2] = 6;

twodim [2, 0] = 7;

twodim [2, 1] = 8;

twodim [2, 2] = 9;

Егер элемент саны алдын-ала белгіленген болса, онда екіөлшемді массивті массив индексаторын қолдану арқылы да инициалдауға болады. Массивті инициализациялауда әрбір жолы жеке-жеке жүйелі жақшаларға алынатын қос жүйелі жақшалар қолданылады.

int [,] twodim ={

{1, 2, 3},

{4, 5, 6},

{7, 8, 9}

}

Инициализаторды қолданған кезде оның әрбір элементі белгіленуі тиіс. Оны қалдырып кетуге болмайды.

Жүйелі жақшалардың ішіне екі үтір көрсетіп, үш өлшемді массив жариялауға болады:

Int [,,] threedim ={

{{1, 2}, {3, 4},

{{5, 6}, {7, 8},

{{9, 10}, {11, 12}}

};

Console.WriteLine (threedim [0, 1, 1]);


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



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