ПредишенСледващото

опасен код

Книгата е предназначена за широк кръг от читатели с интереси в програмирането в C # .Vvedite кратко резюме тук

Книга: C # 4.0: Подробен наръчник

опасен код

Раздели на тази страница:

В C # е позволено да пиша така наречената "опасна" код. В този странен на пръв поглед, не одобрение не е нищо необичайно. Смятан опасен не лошо написан код и код, който не може да се направи под пълен контрол на Common Language Runtime (CLR). Както е обяснено в Глава 1, в резултат на програмиране в C # обикновено управляван код. Независимо от това, този език позволява да се напише код, който не се изпълнява при пълен контрол на CLR. Това неуправляван код не е обект на контрол, и ограниченията, като управляван код, и тя се нарича опасен, защото не може по никакъв начин да се види дали тя изпълнява всяко опасно действие. Следователно, терминът необезпечени не означава, че кодът, присъщо на всички недостатъци. Това просто означава, че кодът може да извършва действия, които не са обект на надзор в контролирана среда.

език C # показалците Заявените и да се използват по същия начин, както в C / C ++. Ако знаете как да ги използвате в C / C ++, а след това няма да е трудно да се направи това в C #. Но не забравяйте, че основната цел на C # - създаването на управляван код. И способността на този език за програмиране за подкрепа на неуправляван код трябва да се използва за решаване на определен тип проблем. Тя е по-скоро изключение, отколкото правило за програмирането на C #. По същество, за съставяне на неуправляван код, за да използвате компилатор опция / безопасна.

Показателите са в основата на опасен код, така че ние ще започне разглеждането на това с тях.

Основи използват указатели

Позовавайки се на конкретен пример. За да се направи променлива показалеца на IP към вътр. трябва да го декларира по следния начин.

показалка поплавък тип се декларира, както е показано по-долу.

Видът на данни, която ще покаже себе си показалеца, зависи от вида на подходяща. Поради това, в по-горните примери променливи IP може да служи за обозначаване на стойност от тип Int. и променливата РП - да се посочи поплавък стойност. Трябва обаче да се има предвид, че нищо не пречи на показалеца да сочи към нищо. Ето защо признаци на потенциално опасни.

Това е основната разлика, за да имате предвид, когато пренасянето C / C ++ код в C #.

Операторите * и знамения

* Операторът може да използва лявата ръка на оператора на задача. В този случай, тя определя стойността, посочен от съответната стрелка, както е в примера по-долу.

Използването на ключовата дума опасен

Всеки код, който използва указатели, трябва да бъдат маркирани като опасни от специална дума опасно. По същия начин, може да се отбележи специфичните видове данни (например, класове и структури), членове на класа (включително методи и оператори) или отделни кодови блокове безопасна. Като пример, по-долу е програма, където указатели се използват в метода на Main (). етикетирани като опасни.

Тази програма дава следния резултат.

Първоначалната стойност на променливата брой: 99
Новата стойност на променливата брой: 10

Използването на модификатор фиксирана

В работата с указатели често се използват фиксиран модификатор. което позволява отстраняването на контролирани "събиране на отпадъци" променлива средства. Необходимостта от това възниква, например, ако показалецът се отнася до областта на един обект на определен клас. И тъй като индексът не знае нищо за действията на "събиране на боклука" на системата, тя ще се насочи към по грешен обект, ако обектът, който искате да изтриете. По-долу е общата форма на фиксирана модификатор:

По-долу е пример за прилагане на фиксирана модификатор.

Ето какви са резултатите в изпълнението на тази програма.

Първоначалната стойност на променливата o.num: 19
Новата стойност на променливата o.num: 10

В този пример, фиксираната модификатор позволява отстраняването на обекта. И тъй като индексът р сочи към променливата o.num инстанция. тя ще покаже фалшив област на паметта, ако изтриете даден обект нататък.

Достъпът до членовете на структурата, като се използва показалка

А показалка може да сочи към обект от тип структура с уговорката, че структурата не съдържа видове справки за данни. За достъп до структурата член с показалеца, използвайте оператора на стрелка - (.) (>), А не на оператора на точка. Например, достъп до членовете на структурата

както следва.

Pointer аритметика

Казаното по-горе може да се обобщи като: след всяко преместване на показалеца ще сочи към мястото на паметта, където се съхранява следващия елемент от подходящ тип и след всяко снижаване показалка ще сочи към мястото на паметта, където се съхранява своя предишен елемент от подходящ тип.

Pointer аритметика не се ограничава само до нарастване и спадане. Чрез знаците, можете да добавите и изважда едно цяло число. Така че, след изчисляване на следния израз:

p1 променлива ще сочи към девети елемент на подходяща го тип по отношение на елемента, за който се посочва в момента.

Ако не можете да добавяте указатели, имате право да изважда една показалка от друг, при условие, че и двете насоки са от същия тип корелация. В резултат на тази операция ще бъде броят на елементи от подходящ тип, които делят двете насоки.

Освен добавянето и изваждането на индекс число и изваждане на две указатели, не са разрешени други аритметични операции върху указатели. По-специално, знаците не може да добавите или извадите от тях, или двойно с плаваща запетая стойност. Не е позволено като аритметиката с указатели тип нищожен *.

По-долу е примерен резултат от изпълнението на програмата. Можете да го докаже по друг начин, макар че разликите между показаната стойност трябва да са едни и същи.

сравняване на знаците

Показалки могат да бъдат сравнени с помощта на релационни оператори като ==. <и>. Но, за да може резултатът се оказа целесъобразни показатели за сравнение, и двете насоки трябва да бъдат по някакъв начин свързани помежду си. Например, ако променливите P1 и P2 са указатели към два различни и несвързани променливи заедно, а след това някой от сравнението, като правило, тя не прави никакъв смисъл. Но ако променливите P1 и P2 показват, свързани с променливи като елементите на масива, за сравняването им може да има някои качества.

Указатели и масиви

В C #, указатели и масиви са свързани един с друг. Например, като се посочва името на масив без индекс в модификатор изявление формира определен указател към началото на масива. Като пример, имайте в предвид следното програмата.

По-долу е резултатът от тази програма.

Както може да се види от горните резултати, изразът

са едни и същи. Но тъй като втората форма е по-кратко, това е по-често се използва в програмирането, когато това се изисква в началото на индекса на масива.

индексиране на показалеца

Когато показалецът се превръща в масив, тя може да бъде индексиран като самия масив. Този синтаксис е по-удобно в някои случаи алтернатива на аритметиката с указатели. Да разгледаме следния програмата проба.

По-долу е резултатът от тази програма.

Както може да се види от резултатите от горните програми, общата форма на изразяване с показалеца

Тя може да бъде заменена с следния синтаксис индексирането масив.

По отношение на показателите на индекса, е необходимо да се има предвид следното. Първо, с тази индексиране границите масив проверка не се извършва. Следователно, показалеца може да се отнася до един елемент извън границите на масива. И второ, за индекса не се осигурява от Дължина имота. определяне на дължината на масива. Ето защо, ако се използва показалеца, дължината на масива не е известна предварително.

Line указатели и

След изпълнение на модификатора на изявление фиксирана променлива р ще сочи към началото на масив от символи, които изграждат линия. Този масив се прекратява в края на символен низ, т.е. нулев знак. Ето защо, този факт може да се използва за проверка на края на масива. В C / C ++ линии са изпълнени като масиви, завършващ нов ред, и следователно, получени тип знак * указател към низ, тя може да бъде манипулирана по същия начин, както в C / C ++.

По-долу е програма, която има достъп до поредица от букви ЗНАК * на тип указател.

Тази програма дава следния резултат.

опасен код

Все пак трябва да се има предвид, че променлива р е указател не е цяло число, и указател към вътр.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!