Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_theory_Ris_1g__Zachita.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
666.83 Кб
Скачать

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

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

1.int x = 9;

2.

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

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

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

Start: (5, 5)

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

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

int v = 123;

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

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

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

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

object o = 15;

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

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

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

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

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

C#

int i;

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

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

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

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

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

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

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

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

Matrix a, b, c;

Matrix d=c*(a+b);

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]