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

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>

{

T obj,

 

public MyObj(T obj)

{

this.obj = obj;

}

 

public void objectType()

{

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

}

}

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

class MyObjects<T, V, E>

{

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<int> obj1 = new MyObj<int>(25);

obj1.objectType();

 

MyObjects<string, byte, decimal> obj2 = new MyObjects<string, byte, decimal>("Alex",26,12.333m);

obj2.objectsType();

 

Console.ReadLine();

}

}

}

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

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

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


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

Жалпыланан кластар ралдары

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

жаттар диспетчері оу жне жазу шін олданылады. Жаа DocumentManager консольін рамыз жне DocumentManager<T> класын осамыз.

using System;

using System.Collections.Generic;

namespace Wrox.ProCSharp.Generics

{ public class DocumentManager<T>

{ private readonly Queue<T> documentQueue=new Queue<T>();

public void AddDocument (T doc)

{ look (this)

{ documentQueue.Enqueue(doc); }

}

public bool IsDocumentAvaiable

{ get {return documentQueue.Count>0;}

}

}

}

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

Енді DocumentManager<T> класына GetDocument() дісін осу керек. Бл дісті ішінде Т типі null-ге меншіктену керек. Біра жалпыланан типке null-ді меншіктеуге болмайды. йткені, жалпыланан тип экземплярды мнні типі ретінде руа ммкіндік береді, ал null тек сілтемелі типтерге ана жіберіледі. Кілттік сз арылы сілтемелі типтерге null мні меншіктеледі, ал мндер типіне – 0.

public T GetDocument()

{T doc=default(T);

lock (this)

{ doc=documentQueue.Decueue();}

return doc;}

Шектеулер

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

}

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))};

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 <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 кортеждер мен массивтерді сорттау шін пайдаланылады. К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#-та тип компиляция уаытында аныталатындытан, айнымалыны жариялааннан кейін ол таы да жариялана алмайды немесе баса типті сатауа ?>