Сапалы параметрлер массивы

NET архитектурасы

C# архиттектурасы мен методологиясы өзінің методологиясында жатқан .NET-ті бейнелейді.

C# келесі екі артықшылықпен сипатталады

1) C# Microsoft .NET Framework-пен жұмыс істеу үшін арнайы жобаланған және жасап шығарылған.

2) C# тілі заманауи объектіге бағытталған методология проекттеуіне негізделген.

.NET-ке бағытталған кодтын орындалуы және компиляциясы.

.NET қаңқасының орталық бөлігі Comman Language Runtime(CLR) немесе .NET runtime болып есептеледі. CLR басқаруымен орындалатын кодты кейде басқарушы код деп те атайды. Алайда, код CLR-де орындалу үшін кез келген бастапқы жазба компиляциялану керек.

.NET компиляциясы 2 қадамнан тұрады:

1) Microsoft Intermediate Language(IL)-ғы бастапқы код компиляциясы

2) CLR арқылы IL компиляциясының платформа үшін спецификалық кодын

Бұл екі қадамды компиляция өте маңызды. Өйткені Microsoft Intermediate Language(IL) болуы .NET-гі көптеген артықшылықтарына кілт болып есептеледі.

Microsoft Intermediate Language (MSIL) тілінің артықшылықтары.

Microsoft Intermediate Language байт код пен Java-ның қарапайым синтаксисті төмендеігейлі тіл идеясымен бөліседі. Бұл нақты анықталған әмбебап синтаксисті кодтың болуы бізге көптеген артықшылықтар береді. Олар:

1) Платформадан тәуелсіз болу

Бұл дегеніміз байт-код нұсқаулықтары кез келген платформада жұмыс істейді

2) Жұмыс өнімділігінің жоғарлығы

IL коды әрқашан тез компиляцияланады және ол Java-ға қарағанда жылдамрақ

3) Арақатнасқа тілдік қабілеттілік

IL қолданылуы тек платформадан тәуелсіздікті қамтамасыз етіп қана қоймай арақатнасқа қабілеттілікті қамтамасыз етеді.


2. Мәндер типі және сілтеме типтер. Берілгендерді өңдеу және атрибуттар.

C# тілінде мәліметтер типінің 2 категориясы бар: Мәліметтер типі, Сілтемелік типтер

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

Бұл типтер жадтың әр түрлі орнында сақталады: Мәліметтер типі стек ретінде анықталған аймақта,ал Сілтемелік типтер басқарылатын үймеде сақталады.Бұл категорияларды ажырата алу өте маңызды,себебі оларға берілген мәндер әр түрлі эффект береді.Мысалы, int мәлімет типі,яғни келесі операторлар нәтижесінде жадтың 2 аймағын құрады,олардың әрқайсысы 20 мәнін сақтайды:

// i & j типтері int

i-20;

j-20;

Келесі кодты қарастырайық. Vector деп аталған класс анықталған дейік. Vector сілтемелік тип int типті Value деп аталған айнымалы бар деп есептейік.

Vector x,y;

X=new Vector();

x.Value=30;

y=x;

Console.Writeline(y.Value);

y.Value=50;

Console.Writeline(x.Value);

Бұл код орындалған соң Vector типті бір ғана объект құрылады,ал x пен y осы объект сақталған аймақты көрсетеді.

x пен y сілтемелік типті айнымалы болғандықтан,олардың әрқайсысының анықталуы Vector типті мәліметті объектінің экземплярын құрмайды, тек сілтемені резервке қояды.Екі жағдайда да объект құрылмайды.Объект құру үшін мысалда көрсетілгендей new түйінді сөзін қолдану керек. x пен y бірдей объектілерге сілтенетіндіктен ,х ке енгізілген өзгертулер у те көрсетіледі.Сондықтан код алдымен 30 кейіннен 50 шығарады.

Егер айнымалы сілтемелік болса,онда ол ешқандай объектіге сілтемейді деп айтуға негіз бар,оның мәнін null теңестіреміз.

Y=null;

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

Атрибут — Attribute базалық класынан мұраға қалған класс.

Оның мәне сипаттауды генерациялауда. Класс, өріс, қасиет н/е әдіске атрибут құру арқылы қалаған қасиеттеріңізді бере аласыз. Атрибут өріс-ң мағынасы мен қасиетіне, клас-ң әдісі-ң орындалуына әсер етпейді, егер де әдіс денесінде атрибутта сақталатын информация болмаса. Алайда, ең бастысы - атрибут-ң мәнін код-ң орындалу процесінде өзгертуге болмайды, с/бі олар-ң қасиет-ң мағынасы компиляцияланған модульде константа түрінде сақталады.


3. С# программалау тілінің негізі. Айнымалыларды жариялау. Айнымалыларды инициялизациялау олардың көріну облысы.

C # -та айнымалыларды жариялау синтаксисі келесі түрде болады:

Мәліметтер типі Иденфикатор;

Мысалы,

int і;

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

Айнымалы жарияланған соң,оған мәнін = арқылы береміз:

і=10;

Бір мезгілде айнымалыны жариялап және оны инициялизациялауға болады.

int i=10;

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

int i=10,y=20; // x және y int типті

Әртүрлі типті айнымалыларды жариялау үшін бөлек-бөлек операторларды пайдалануға тура келеді.Көпшілік жарияланым ішінде әр түрлі типтегі мәндерді меншіктеуге болмайды.

int x=10;

bool y=true; // true немесе false қайтаратын айнымалыны құрады.

int x=10,bool y=true; // Бұл компиляциядан өтпейді!

//Осы белгіге назар аударсаңыз ол түсініктеме(комментарий). // кезегі өзінен кейін тұрған мәтінді түсініктеме екенін білдіреді.Бұл тек адамдарға программаны дұрыс түсіну үшін оқу үшін қажет.Өзі программаның бөлігі болып табылмайды.

Айнымалыларды инициализациялау C # -та қауіпсіздікті қамтамасыз ету мысалын көрсетеді.

Қысқаша айтқанда,C # -та компилятор кез-келген айнымалы қандай да бір операцияға қолданбай тұрып,бастапқы мәнінде инициялизацияланғанын талап етеді.

C # -та айнымалыларды қолданбас бұрын инициялизациялау үшін 2 әдіс қолданылады.

Ø Класс не структураның жолы боп табылатын айнымалылар анық инициялизацияланбаса, келісім бойынша нольге тең болады

Ø Әдіске қатысты айнымалылар кодта кез-келген мәні қолданылатын оператордың пайда болуына дейін анық инициализациялануы тиіс.

Мысалы, C # -та келесі түрде жазбау қажет:

public static int Main()

{ int d;

Console.WriteLine(d); //Бұлай болмайды!

//d –ны қолданбас бұрын инициализациялау керек.

return 0;}

Бұл кодта назар аударсаңыз Main() әдісі void орнына int қайтарып тұр.Егерде сіз осы қатарларды компиляцияға жіберер болсаңыз,қате жөнінде хабарлама аласыз.

4. C#-тың алдын ала анықталған мәндер типі. Main() әдісі.

C#-та деректер типінің екі категориясы бар:

· мәндер типі

· сілтемелі типтер

Олардың айырмашылығы: сілтемелі тип сілтемені мәнге сақтаған кезде, мәндер типі мәліметтерді тікелей сақтайды.

Мәндер типі жадының стек аймағында сақталады.

C#-тың алдын ала анықталған мәндер типі

Кіріктірілген типтер бүтін және жылжымалы үтірі бар сандарды, символдық және бульдік типтер сияқты примитивтерді көрсетеді.

Бүтін санды типтер

C# тілі 8 алдын-ала анықталған бүтін санды типтерді қолдайды:

Аты CTS типі Сипатталуы Диапазоны
Sbyte System.SByte Таңбамен 8-битті бүтін -128:127 (-2: 27-1)
Short System.Int16 Таңбамен 16-битті бүтін -32 768:32 767 (-215: 215-1)
Int System.Int32 Таңбамен 32-битті бүтін -20 147 483 648:2 147 483 647 (-231: 231-1)
Long System.Int64 Таңбамен 64-битті бүтін -9 223 372 036 854 775 808: 9 223 372 036 854 775 807 (-263: 263-1)
Byte System.Byte Таңбасыз 8-битті бүтін 0:255 (0: 28-1)
Ushort System.Uint16 Таңбасыз 16-битті бүтін 0:65 535 (0: 216-1)
Uint System.Uint32 Таңбасыз 32-битті бүтін 0:4 294 967 295 (0: 232-1)
Ulong System.Uint64 Таңбасыз 64-битті бүтін 0:18 446 744 073 709 551 615 (0: 264-1)

Жылжымалы үтірі бар тип

Аты CTS типі Сипатталуы Таңбалар саны Диапазоны
Float System.Single Дәлдігі біреулік жылжымалы нүктемен 32-битті ±1.5×10-45-нен ±3.4×1038-не дейін
double System.Double Дәлдігі екілік жылжымалы нүктемен 64-битті 15/16 ±5.0×10-324-нен ±1.7×10308-не дейін

Float типті айнымалылар жылжымалы нүктелі кіші мәндерге арналған.double типті мәліметтер Float қарағанда дәлірек.Егер мәнді Float ретінде спецификациялау керек болса,оған F символын қосу керек:

5. Консольді енгізу-шығару үшін System.Console-ді пайдалану. Процессор директивтері.

Консольді енгізу-шығару үшін System.Console-ді пайдалану

Консольді терезедегі жолдарды оқу үшін Console.ReadLine() әдісі қолданылады. Ол консольді терезедегі кіріс ағынын есептеп, қайта қайтарып отырады. Консольді терезеге жазудың екі әдісі бар. Олар:

Ø Console. Write( ) – берілген мәнді консольді терезеге жазады;

Ø Console. WriteLine( ) – ол да тура сондай, бірақ мәлімет соңына жаңа жол символын қосады.

Console. WriteLine( ) сонымен қатар C-ғы printf() сәйкес функциясын форматталған түрде көрсетуге рұқсат береді. Console. WriteLine( )-ды қолдану үшін бірнеше параметрлер бар.Әрбір маркер параметр нөмірін көрсететін индекстен тұрады Мысалға {0} тізімнен алғашқы параметрді көрсетеді.Мысалы:

Int i=10;

Int j =20;

Console.WriteLine(“{0} қосу{1} тең{2}”, i, j, i+j);

Бұл код келесіні шығарады:

10 қосу 20 тең 30

Процессор директивтері.

Процессор директивтері кодты орындайтын командаларда ешқашан көрсетілмейді , бірақ компиляцияның процесіне әсер етеді. Басқаша айтқанда кодқа кейнге қалдырылған мәліметтен тұратын фрагменттер қойылған кезде.

Барлық процессор директивалары # белгісінен басталады.

Келесіде директивалар қолданысының қысқаша анықтамасын көрсетелік:

# define және#undef

# define директивасы “#define DEBUG” түрінде қолданылады және бұл директива компиляторға осындай атаудағы (біздің жағдайда DEBUG) символ бар екендігін хабарлайды.

#undef директивасы қарама қарсы амалын орындайды- белгілі символдарды өшіреді:

#undef DEBUG

#define және #undef директиваларын C# алғашқы кодының бас жағында орналастыру керек.

#if, #elif, #else және#endif

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

#warning және #error

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

#regionжәне#endregion

#region және #endregion директивалары берілген блоктағы код берілген атаумен жалпы біртұтас ретінде қарастырылуын көрсетеді


6. Объекті/ ж/е типтер. Структура және кластардың өзара айырмашылық/ы. Класс мүшелері.

Объектілер.

Класс объектілері көбінесе оның экземплярлары, яғни даналары деп аталады. Объектілерді программалаушылар тікелей командалар арқылы құрады немесе оларды жүйе өздігінен автоматты түрде де жасай алады. Программалаушы класс экземплярын new операциясы арқылы құрады.

Мысалы: Demo a = new Demo(); // Demo класы // экземплярын жасау Demo b = new Demo(); // Demo класының // басқа экземплярын жасауКласс мәліметтердің сілтемелік типтеріне жатады, олар мәліметтің өзін емес, тек адресін есте сақтайды. Сілтемелік типтегі мәліметтер үйіндіде (куча - heep) сақталады. Сонымен a мен b объектілердің адрестерін сақтайды. Егер объектіні сақтауға жеткілікті жады көлемі бөлінбесе, онда new операциясы OutOfMemory-Exception ерекше жағдайын туындатады. Үлкен көлемді объектілерді пайдаланғанда, осындай жағдайды өңдеу әрекетін қарастыру керек.

Объектілерді меншіктеу және салыстыру

•b = c

•Сілтемелік типтегі шамалар тек бір жерде орналасқан мәліметтер-ге сілтеме жасап тұрса,тең болып саналады (b == c, бірақ a != b олардың мәндері тең болса да немесе екі мәнде де null-ге тең болған жағдайда да).

Типтер.

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

Сілтемелік типтер мәліметтердің өздерін емес, олардың адрестерін сақтайды, мұндағы мән ком-пьютердің динамикалық жадындағы басқа бір объектіге (үйіндіге – кучаға) сілтеу арқылы жасалады. Мәндер типтеріне логикалық тип, арифметикалық тип, құрылымдар және саналатын (перечисления) типтер жатады. Сілтемелік типтерге жиымдар, сөз тіркестері (жолдар) және кластар жатады.

Структура және кластардың өзара айырмашылық/ы.

Структура интерфейсті іске асырады және ол мұраланбайды. Структура құрылғылары мен жолдары бар әдісті анықтайды. Структура – мағыналы, ал класс – сілтемелік тип болып табылады.

Класс түрлері: негізгі, туынды, абстрактілі кластар және интерфейс. Айырмашылықтары: негізгі класс ата-аналық класс болып табылады, себебі бұл класс негізінде басқа класстар құрылады; туынды класс – негізгі кластың кейбір қасиеттерін мұралап, одан туындаған класс; абстрактілі класс – бұл базалық класс, мұның негізінде даналар құрылмайды; интерфейс – код программасындағы семантикалық және синтаксистік конструкция.

7. Мән бойынша беру және сілтеме бойынша беру. Әдістің жүктелуі. Әдістер

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

Әдістерді жариялау

Әдістерді жариялау әртүрлі модификаторлардан тұрады, қайтымды мғына типіндегі, онда әдіс кейін, жақшаның ішінде аргумент тізімі, пішінді жақшада әдіс негізі болады.

(модификатор) тип- қайтымды аты әдісі (параметр)

Әдіс негізі

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

Public bool IsSguare (Rectangle rect)

Return (rect.Height—rect.Width)

Бұл кодта базалық класстың бірі қолданыста тұр. NET,System,Drawing,Rectangle. Тікбұрышты көрсетеді.

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

Public bool IsPositive (int value)

If (value <0)

Return false

Return true

Әдістерді шақыру

Келесі мысалда, MathTest класс экземплярын құру және анықтау демонстрацияланады, сомен қатар әдіс анақтамасы және оны шақыру.

Using System

Namespace Wrox

Class mainEntryPoint

Static void Main ()

Кейбір статикалық функцияларды шақыру мүмкіндіктері

Console.WritLine(“Pi тен +MathTest.Get.Pi());

Int x =MathTest.GetSguareOf (5)

Console.Write.Line (‘5 тенквдраттауда “+x)

MathTest нысанды құру

MathTest =new MathTest () экземпляр

Статикалық емес әдісті шақыру

Math.value=30

Console.writeLine (‘value өрісі ауыспалы math+math.value)

Console.WriteLIne(30 квадраттатен +math.GetSguare)

MathTestкласын анықтау, class MathTest әдісін шақыру

Public int value

Public int GetSguare ()

Return value * value

Public static int GetSguareOf (int X)

Return x*x

Public static double GetPi () Return 3.14159

8. Конструкторлар және статикалық конструкторлар. Тек оқуға рұқсат етілген өріс.

Конструкторлар.

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

Конструкторлар қасиеттері:

•Конструктор ешқандай мән (тіпті void типін де) қайтармайды.

•Кластың, инициалдаудың әр түрлері үшін әртүрлі параметрлері бар, бірнеше конструкторлары болуы мүмкін.

•Егер программалаушы бірде-бір конструкторды көрсетпесе немесе кейбір өрістер инициалданбаса, мәндік типтегі өрістерге — нөл, ал сілтемелік типтегі өрістерге — null мәні меншіктеледі.

•Параметрсіз шақырылатын конструктор (үнсіз) келісім бойынша алынған конструктор деп аталады.

Конструкторы бар класс мысалы

using System;

namespace Listing5_6 {

class Demo

{

public Demo( int a, double y ) // конструктор

{

this.a = a;

this.y = y;

}

int a;

double y;

}

class Class1

{ static void Main()

{

Demo a = new Demo( 300, 0.002 ); // конструктордышақыру

Console.WriteLine( a.Gety() ); // нәтиже: 0,002

Demo b = new Demo( 1, 5.71 ); // конструктордышақыру

Console.WriteLine( b.Gety() ); // нәтиже : 5,71

} } }

Статикалық конструкторлар.

Осы конструктор тек бір рет орындалады, барлық жазбалы конструкторларға қарама қарсы, олар констукторлар түрлері әрбір жаңа обьект сайын орындалады..Статикалық конструктордың жазылуының бірінші себебі, кластың кейбір статикалық жолдар мен құрлымының ішкі инцализациялануы, олай болған жағдайда класс бірінші орындалады..NET атқарушы ортада ешқандай кепілдік бермейді, статикалық конструктр шақырылынатын болады, сол себебтен кодты бөгет жасауға болмайды. Нақты болжам жасауға болмайды, қандай ретпен статикалық конструктр әр түрлі класспен.Статикалық конструктр көп дегенде бір рет іске асады және кез-келген негізгі класстың біріншісіне шақырылады. С# статикалық конструкторы ештеңеге қарамастан кез –келген класс мүшеснде іске асады.

Статикалық конструктор ешқандай модификаторға мүмкіндікке ие емес.

9.Жекеленген кластар. Статикалық кластар. Object класы.

Жекеленген кластар

Partial ( жеке) кілттік сөзі классты,құрылымды,интерфейсті анықтауға мүмкіндік береді.

Partial кілттік сөзі класстың, құрылымның, интерфейстің алдында орналасады.

Класстың сипатталуында төменде келтірілген кілттік сөздер қолданылады:

-public

-private

-protected

-internal

-abstract

-sealed

-new

-жалпы шектеулер

Енгізілен бөліктер де солай орындалады, Partial кілттік сөзі class кілттік сөзімен әсер етеді.

Статикалық кластар

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

Static class StaticUtilities

Ø {Public static void HelperMethod(){}}

HelperMethod() функциясын шақыру үшін StaticUtilities типінің объектісі қажет емес. Шақыру кезінде типтің аты аталады:

StaticUtilities.HelperMethod();

Object класы

Алдында айтып өткендей, System.Object класы басынан .NET кластарын мұралайды. Егер жаңа класты ашу кезінде базалық класс көрсетілмесе, компилятор автоматты түрде оның Object класынан мұраланып тұр деп есептейді. Бұл бөлімде мұралау қолданбайды дегенмен, сіздер көріп тұрған барлық кластар негізінде Object класынан мұраланып тұр. (жоғарыда көрсетілгендей құрылым үшін мұралау түзу емес. Құрылым System.ValueType класы арқылы мұраланып тұр, ал ол өз кезегінде System.Object класы арқылы мұраланып тұр.)

Практикалық мәні: сіз анықтайтын әдістер мен қасиеттерден бөлек, Object класында анықталған жалпы және қорғалған әдістер мен қасиеттер пайда болады. Бұл әдістер барлық анықталған кластарда қатысады.


10. Мұралау. Мұралау типі. Іске асыруды (реализация) мұралау.

Объектіге бағытталған программалау тілінде мұралаудың екі түрі бар: іске асыруды мұралау және интерфейсті мұралау.

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

2. Интерфейсті мұралау. бұл тип тек функция сигнатурасына мұраланады. Бірақ ешқандай іске асыруды мұраламайды. Мұралаудың бұл типі белгелеі бір құралдарға қол жетімділік болу үшін оларды спецификациялау кезінде қолданған қолайлы болып келеді.

С# тілінде іске асыру мұрагерлігін де интерфейс мұрагерлерлігін де іске асыруға болады. Бұл типтердің екеуі де С# программалау тілі құрастырғалы қолданылып келеді.

· Құрылымдар system.ValueType арқылы мұраланады. Олар кез келген көлемді интерфейсті мұрагерлей алады.

· Кластар әрқашан сіз таңдаған белгілі бір класты мұралайды. Онымен қоса олар кез келген көлемді интерфейсті мұрагерлей алады.

Іске асыруды мұралау.Клас басқа кластан мұраланатынын хабарлау үшін келесі синтаксис қолданылады:

Class мұраланған класс:Базалық класс

{ // мәліметтер-мүшесі және функция-мүшелер }

Егер клас интерфейстарді мұраласа, онда базалық кластың және интерфейстердің тізімі үтір арқылы орналасады:

Public class MyDerivedClass: MyBaseClass, IInterface1, IInterface2

{// және т.б.}

Егер класты анықтауды базалық класс көрсетілмеген болса, онда C# компиляторы базалық класс System.Object деп шешеді. Сол себепті келесі код фрагменттері өзара эквивалетті болады:

1) Class Myclass: Object // System.Object арқылы мұраланады.

{// және т.б.}

2) Class Myclass: Object // System.Object арқылы мұраланады.

{// және т.б.}

Object класына бағытталуы үшін Object кілттік сөзін қолданыңыз, ол Visual Studio .NET интелектулды редакторларымен анықталады.

11. Мұралау.Рұқсат модификаторлары. Интерфейстер.

Модификаторлар public және private әдістерін көрсетілуін қамтамасыз ете алады. Онымен қоса олардың virtual және abstract екендігн анықтай алады. C# тілінде модификатордың көптеген түрі анықталған.

Рұқсат модификаторлары.

Модификатор Сипаттамасы
Public Элемент кез келген баска кодта көрінеді.
Protected Элемент тек кез келген туынды типке көрінеді.
Internal Элемент тек шектелген құрылымда көрінеді.
Private Элемент тек өзі байланысты тип шегінде көрсетіледі.
Protected interval Элемент тек шектелген құрылымда және кез келген туынды тип кодында көрінеді

Егер қосылған тип бар болатын болса, ол сыртқы тип мүшелерінің бәріне кіруге рұқсаты бар.

Басқа қосымша модификаторлар

Модификатор Сипаттамасы
New Бұл мүше сол сигнатурамен мұраланған мүшені көрсетпейді
Static Бұл мүше нақты клас экземплярымен байланысты емес
Virtual Мүше мұрагерлік кластарда кайта анықтауы мүмкін.
Abstract Сигнатураны анықтайтынғ бірақ іске асыруды жасамайтын виртиалды мүше
Override Базалық кластың мұраланған виртуалды немесе абстракты мүшесін қайта анықтайды.
Sealed Басқа кластарға осы кластан мұралауға болмайтынын айтады.
Extern Бұл мүше басқа тілде,сыртқы түрде жасалған

Интерфейстер

Объектіге бағытталған тілдер интерфейстерді қолдана алатындығына байланысты біз С# программалау тіліндегі интерфейстерді іске асруды қарастырайық. Біз IDisposable интерфейс қарастырайық.

Егер класс Dispose() әдісін іске асыруын хабарлағысы келсе, онда ол IDisposable интерфейсін іске асыруы керек, C# терминінде ол IDisposable мұраланады деп есептеледі.

Интерфейсті анықтау және іске асыру.

Код атын интерфейс екенін түсіну үшін келісім бойынша I әрпінен бастаймыз.

12. Жалпылау. Жалпылауға шолу. Жалпыланған кластар құру.

Жалпылау – бұл параметрлі тип. Төменде жалпылау класын хабарлау-ң жалпы формасы көрсетілген:

class класс_аты { // ...

Ал былай жалпылау класқа сілтеме жібреу синтаксисі көрсетілген:

класс_аты айнымалы_аты =

new класс_аты (тип_аргумент-ң_тізімі);

Мысалдар келтірсек:

namespace ConsoleApplication1

// Т параметрі бар жалпылау класын құрайық

class MyObj

{

T obj,

public MyObj(T obj)

{

this.obj = obj;

}

public void objectType()

{

Console.WriteLine("Тип объекта: " + typeof(T));

}

}

// Бірнеше параметрі бар жалпылау класы

class MyObjects

{

T obj1;

V obj2;

E obj3;

public MyObjects(T obj1, V obj2, E obj3)

{

this.obj1 = obj1;

this.obj2 = obj2;

this.obj3 = obj3;

}

public void objectsType()

{

Console.WriteLine("\nТип объекта 1: " + typeof(T)+

"\nТип объекта 2: " + typeof(V) +

"\nТип объекта 3: " + typeof(E));

}

}

class Program

{

static void Main()

{

// int жалпыланған клас-ң экземпляры

MyObj obj1 = new MyObj(25);

obj1.objectType();

MyObjects obj2 = new MyObjects("Alex",26,12.333m);

obj2.objectsType();

Console.ReadLine();

}

}

}

MyObj класы үшін аргумент типі көрсетілгенде, м/лы, int н/е string, онда С#-да құрастылылған(сконструированный) д.а. тип құрылады. Сон.қат., MyObj жабық құрастырылған тип болып табылады. С/бі, шынайы келгенде, MyObj сияқты жалпыланған тип-абстракция. Нақты вариант құрылғаннан кейін, м/ға MyObj, нақты тип құрылады. Ал MyObj сияқты конструкция, С#-та ашық құрастырылған, с/бі онда int секәлдә нақты тип емес, Т параметр типі көрсетіледі.

Ашық тип деп аргумент параметр типі н/е оны өзіне қосатын параметр типі н/е кез келген жалпыланған тип саналады. Ал ашық типке жатпайтын кез келген тип жабық тип боп есептеледі. Құрастырылған тип д-міз тип-ң барлық аргументі көрсетілген жалыпланған тип.

Тағы да бір жағдай. Мынадай сұрақ тууы мүмкін: MyObj жалпылау класы-ң дәл осындай функционалдық мүмкіндік-н жалпылаусыз-ақ алуға болады, жай ғана объектті дерек-р типі ретінде көрсетіп, типті тиісті келтіруді орындау арқылы. Онда MyObj класын жалпылаудан не пайда? Жалпылау автоматты түрде MyObj класына қатысты барлық операция-ң типтік қауіпсіздігін қамтамасыз етеді.


13. Жалпыланған кластар құралдары. Жалпыланған интерфейстер.

Жалпыланған кластар құралдары

Жалпыланған кластарды құру барысында C#-тың қосысша кілттік сөздері қажет болуы мүмкін. Мысалы, жалпыланған типке null мәнін меншіктеу мүмкін емес. Бұл жағдайда default кілттік сөзін қолдануған болады. Егер жалпыланған тип Object класының құралдарын қажет етпесе, бірақ кейбір спецификациялық әдістерді шақыру керек болса, шектеулерді анықтауға болады.

Құжаттар диспетчері оқу және жазу үшін қолданылады. Жаңа DocumentManager консольін құрамыз және DocumentManager класын қосамыз.

using System;

using System.Collections.Generic;

namespace Wrox.ProCSharp.Generics

{ public class DocumentManager

{ private readonly Queue documentQueue=new Queue();

public void AddDocument (T doc)

{ look (this)

{ documentQueue.Enqueue(doc); }

}

public bool IsDocumentAvaiable

{ get {return documentQueue.Count>0;}

}

}

}

Үндеместік бойынша мәндер

Енді DocumentManager класына GetDocument() әдісін қосу керек. Бұл әдістің ішінде Т типі null-ге меншіктену керек. Бірақ жалпыланған типке null-ді меншіктеуге болмайды. Өйткені, жалпыланған тип экземплярды мәннің типі ретінде құруға мүмкіндік береді, ал null тек сілтемелі типтерге ғана жіберіледі. Кілттік сөз арқылы сілтемелі типтерге null мәні меншіктеледі, ал мәндер типіне – 0.

public T GetDocument()

{T doc=default(T);

lock (this)

{ doc=documentQueue.Decueue();}

return doc;}

Шектеулер

Егер жалпыланған класқа жалпыланған типтен кейбір әдістерді шақыру керек болса, онда шектеулер қосу керек. DocumentManager жағдайында барлық құжаттардың тақырыптары 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;}

}

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

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

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

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

public struct Nullable 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 value)

{return value.Value;}

public static implicit operator Nullable(T value)

{return new Nullable(value);}

Public overridge string ToString()

{if (!HasValue)

return String.Empty;

return this.value.Tostring();}}

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

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

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

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

void swap (ref T x,ref T y)

{t temp,temp=x;

temp =x;

x=y;

y=temp;}

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

int i=4;

int=5;

Swap

(ref I ,ref j))};

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 массиві төрт бүтін мәндермен хабарланып инициализациялануда.

16. Тісті массивтер. Array класы.

Тісті массивтер.Екіөлшемді массив тікбұрышты формада болады. Тісті массив өлшеміне қарағанда майысып тұрады. Мұндай массивтерде әрбір жол өлшемдері өзгеше болуы мүмкін. Төмендегі мысалда 3х3 екіөлшемді массиві мен 1жол 2элементтен, 2жол 6, 3жол 3элементтен тұратын тісті массив көрсетілген.

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

Int [] [] jagged = new int [3] [];

jagged [0] = new int [2] {1, 2};

jagged [1] = new int [6] {3, 4, 5, 6, 7, 8};

jagged [2] = new int [3] {9, 10, 11};

Array класы.Массивтерді құруға, өзгертуге, іздеуге және сұрыптауға арналған әдістерді береді, яғни CLR ортасында барлық массивтерге базалық класс ролінде қызмет атқарады.

Мұралау иерархиясы

System.Object
System.Array

Синтаксисі

[SerializableAttribute][ComVisibleAttribute(true)]public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IstructuralEquatableArray класы массивтермен жұмыс жасайтындарға ғана базалық болып табылады. Array класынан тек қана жүйе мен компиляьор мұралай алады. Қолданушылар программалау тілі ұсынатын массив конструкцияларын қолдануы керек.//Класс Arrayint[ ] ar1 = new int[5]; double[ ] ar2 ={5.5, 6.6, 7.7}; int[ , ] ar3 = new Int32[3,4];

Массиві бар барлық класстар System.Array класының мұрагерлері болып табылады. System.Array класы бірқатар интерфейстерді мұралайды: ICloneable, IList, ICollection, Enumerable, және класс олардың барлық қасиеттері мен әдістерін іске асыру қажет. Object класы мен көрсетіліп кеткен интерфейстердің қасиеттері мен әдістерінен басқа, өзінің де біршама қасиеттері мен әдістері бар.

17. Массивтер параметр ретінде. Тізім бойынша санау.

Массивтер параметр әдісімен беріле алады және әдістен шыға алады.Массивтің қайтарылуы үшін қайтару типі ретіне массивті шақыру жеткілікті.Ол GetPersons( ) әісінде былай көрсетілген:

Static Person[ ] GetPersons ( )

{

Return new Person [ ] {

New Person { FirstName=”Damon”, LastName=”Hill”},

New Person { FirstName=”Niki”, LastName=”Lauda”},

New Person { FirstName=”Ayrton”, LastName=”Senna”},

New Person { FirstName=”Graham”, LastName=”Hill”}

};

}

Массивтің берілуі үшін параметре шақырылады, DisplayPersons ( ):

Static void DispayPersons ( Person [ ] persons )

{

// …

Массивтің коварианттылығы

Массивтің коварианттылығы дегеніміз – бұл массивтің базалық тип ретінде шақырылуы және оның элементі болып туынды элементтер саналады.Мысал:

Static void DisplayArray ( object [ ] data )

{

// …

}

Массивтерің коварианттылығы сілтеме типтер үшін ғана мүмкін.

Сапалы параметрлер массивы

Массивті параметрдің сапасына қарай әдіске береді және әдістен қайтарады.Массивті қайтару үшін жариялау типіне массивті қайтару жеткілікті,келесіде көрсетілгендей GetPersons():

staticPerson[]GetPersons()

returnnewPerson[](

newPerson(FirstName=“Damon“,LastName="Hill“),newPerson(FirstName=“Niki“,LastName=“Lauda“),newPerson(FirstName=“Ayrton",LastName=“Senna“},newPerson(FirstName="Graham",LastName="Hill"}

Массивті жіберу ,массивтің параметірде хабарлау әдісі DisplayPersons() :

staticvoidDisplayPersons(Person[]persons)

Тізімдер

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

Интерфейс IEnumerator To reach әдісі IEnumerator интерфейс әдістері үшін қадамның барлық элементтеріне қолданылады. Бұл интерфейстің толық нұсқасы IEnumerator , 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 бір элементті, Tuple екі элементтен тұрады.

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

Public static Divide(int dividend, int divisor)

{

Int result=dividend/divisor;

Int reminder=dividend%divisor;

Return Tuple.Create(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

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

Var tuple=Tuple.create

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

Tuple.create(52,3490));

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

Массивтер сияқты кортеждер де IStructuralEquatable және IStructuralComparable интерфейстерін жүзеге асырады. Бұл интерфейстер .NET 4-те пайда болды және сілтемелерді ғана емес, сондайақ оның ішіндегілерді де салыстыруға мүмкіндік береді. Интерфейс айқын жүзеге асырылады, сондықтан оны қолдану кезінде массивтер мен кортеждердің келуін іске асыру керек. IstructuralEquatable екі кортеж немесе кортеждің ішіндегілер бірдей ма соны анықтайды, ал IstructuralComparable кортеждер мен массивтерді сорттау үшін пайдаланылады. Кeлесі мысалда IstructuralEquatableдың қолданылуын көрсететін, lEquatable интерфейсі іске асырылатын Person классы құрылған. Бұл интерфейс FirstName және LastNAme ерекшеліктерін салыстыратын 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#-та тип компиляция уақытында анықталатындықтан, айнымалыны жариялағаннан кейін ол тағы да жариялана алмайды немесе басқа типті сақтауға &#


8008900720718986.html
8008982112434767.html

8008900720718986.html
8008982112434767.html
    PR.RU™