Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 130

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

ИзмСнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массивов

ΠœΠ°ΡΡΠΈΠ²Ρ‹ C# ΡΠ²Π»ΡΡŽΡ‚ΡΡ динамичСскими, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ число элСмСнтов Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ размСрности Π²ΠΎ врСмя компиляции (Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ Π² динамичСски выдСляСмых массивах Π² C++). Однако Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΈ созданы ΠΈΡ… экзСмпляры. Если трСбуСтся это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ связанныС с этим классы Π² пространствС ΠΈΠΌΠ΅Π½ System.Collections Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ System.Collections.ArrayList. Однако Π² этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ C# Π½Π΅ отличаСтся ΠΎΡ‚ C++. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ массивы C++ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π½ΠΎ сущСствуСт ряд классов стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ это свойство.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ

Π’ C# ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ пСрСчислСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ синтаксису C++.

// допустимо Π² C++ ΠΈΠ»ΠΈ C#

enum TypeOfBuilding {Shop, House, OfficeBlock, School};

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° с запятой Π² C# Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пСрСчислСния Π² C# являСтся фактичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ структуры, Π° опрСдСлСния структур Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой.

// допустимо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² C#

enum TypeOfBuilding {Shop, House, OfficeBlock, School}

Однако Π² C# пСрСчислСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² C++ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ для пСрСчислСния являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ Π² C++, элСмСнты пСрСчислСния Π² C# Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ нуля Π² сторону увСличСния, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

enum TypeOfBuilding {Shop, House=5, OfficeBlock, School = 10}

// Shop Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, OfficeBlock Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 6

Бпособ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ происходит доступ ΠΊ значСниям элСмСнтов, отличаСтся Π² C#, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² C# Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ имя пСрСчислСния.

Бинтаксис C++:

TypeOfBuilding MyHouse = House;

Бинтаксис C#:

TypeOfBuilding MyHouse = TypeOfBuilding.House;

МоТно Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ это ΠΊΠ°ΠΊ нСдостаток, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ синтаксис ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊ, Π½Π΅ это Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ пСрСчислСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² C# Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ. Π’ C# ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ пСрСчислСниС являСтся ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ структурой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· System.Enum) ΠΈ поэтому ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π’ частности, для любого пСрСчислСнного значСния ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

TypeOfBuilding MyHouse = TypeOfBuilding.House;

string Result = MyHouse.ToString(); // Result Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ "House"

Π­Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² C++.

Π’ C# ΡΡ‚ΠΎ дСлаСтся ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Parse() класса System.Enum, хотя синтаксис Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ

TypeOfΠ’uilding MyHouse = (TypeOfBuilding)Enum.Parse(typeof(TypeOfBuilding), "House", true);

Enum.Parse() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ ссылку ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ явно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ (распакован) ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ enum. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π² Parse() являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System.Π’yΡ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт, ΠΊΠ°ΠΊΠΎΠ΅ пСрСчислСниС Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ строка. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ являСтся строкой, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ рСгистр символов. Вторая пСрСгруТаСмая вСрсия опускаСт Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π½Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ рСгистр символов.

C# позволяСт Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ описанный Π½ΠΈΠΆΠ΅ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для хранСния enum:

enum TypeOfBuiding : short {Shop, House, OfficeBlock, School};

Если Ρ‚ΠΈΠΏ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ int.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² C# Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ Π² C++, ΠΊΡ€ΠΎΠΌΠ΅ Π΄Π²ΡƒΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ:

β–‘ C# опрСдСляСт Π±Π»ΠΎΠΊ finally, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΊΠΎΠ΄, всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ Π±Π»ΠΎΠΊΠ° try нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π»ΠΎΡΡŒ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ этого свойства C++ явилось ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅Π΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²Π° срСди Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² C++. Π‘Π»ΠΎΠΊ finally выполняСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ Π±Π»ΠΎΠΊ catch ΠΈΠ»ΠΈ try, ΠΈ содСрТит ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠΎΠ΄ очистки Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Π±Π»ΠΎΠΊΠ΅ try рСсурсов.

β–‘ Π’ C++ класс, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ классом. C#, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ классом, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ System.Exception.

ΠŸΡ€Π°Π²ΠΈΠ»Π° выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π±Π»ΠΎΠΊΠ°Ρ… try ΠΈ catch ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ Π² C++ ΠΈ C#. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ синтаксис Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ², Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ различия: Π² C# Π±Π»ΠΎΠΊ catch, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ опрСдСляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, обозначаСтся самой инструкциСй catch. Бинтаксис C++:

catch (...) {

Бинтаксис C#.

catch {

Π’ C# этот Π²ΠΈΠ΄ инструкции catch ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ΄ΠΎΠΌ, написанным Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… языках (ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ поэтому ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ System.Exception, компилятор C# ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния для Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования).

ΠŸΠΎΠ»Π½Ρ‹ΠΉ синтаксис для try…catch…finally Π² C# выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

try {

 // ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

} catch (MyException e) { // MyException выводится ΠΈΠ· System.Exception

 // ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки

}

// Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ catch

finally {

 // ΠΊΠΎΠ΄ очистки

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊ finally являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π’Π°ΠΊΠΆΠ΅ допустимо Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠ² catch, Π² этом случаС конструкция try…finally слуТит просто способом обСспСчСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π² Π±Π»ΠΎΠΊΠ΅ finally всСгда выполнялся, ΠΊΠΎΠ³Π΄Π° происходит Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π±Π»ΠΎΠΊΠ° try. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π±Π»ΠΎΠΊ try содСрТит нСсколько инструкций return ΠΈ трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ очистку рСсурсов, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈ нСбСзопасный ΠΊΠΎΠ΄

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π² C# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ Π² C++. Однако ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π±Π»ΠΎΠΊΠ΅ нСбСзопасного (Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ) ΠΊΠΎΠ΄Π°. Π›ΡŽΠ±ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ нСбСзопасным (unsafe):

public unsafe void MyMethod() {

МоТно Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ любой класс ΠΈΠ»ΠΈ структуру нСбСзопасными ΠΈ:

unsafe class MyClass {

ОбъявлСниС класса ΠΈΠ»ΠΈ структуры Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Ρ‡Π»Π΅Π½Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ любоС ΠΏΠΎΠ»Π΅-Ρ‡Π»Π΅Π½ (Π½ΠΎ Π½Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅) ΠΊΠ°ΠΊ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅, Ссли имССтся ΠΏΠΎΠ»Π΅-Ρ‡Π»Π΅Π½ Ρ‚ΠΈΠΏΠ° указатСля:

private unsafe int* Ρ€Π₯;

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠ°ΠΊ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: 

unsafe {

 // инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

Бинтаксис для объявлСния, доступа, разымСнования ΠΈ выполнСния арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с указатСлями Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² C++:

// этот ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² C++ ΠΈΠ»ΠΈ C#

// ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΎΠ±ΠΎΠΈΡ… языках

int X = 10, Y = 20;

int *Ρ€Π₯ = &Π₯;

*Ρ€Π₯ = 30;

pΠ₯ = &Y;

++Ρ€Π₯; // добавляСт sizeof(int) ΠΊ Ρ€Π₯

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹.

β–‘ Π’ C# Π½Π΅ допускаСтся Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ void*, Ρ‚Π°ΠΊΠΆΠ΅ нСльзя Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ указатСлями void*. Бинтаксис указатСля void* Π±Ρ‹Π» сохранСн для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости, для Π²Ρ‹Π·ΠΎΠ²Π° Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π·Π½Π°ΡŽΡ‚ ΠΎ .NET ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ void* Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

β–‘ Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ссылочныС Ρ‚ΠΈΠΏΡ‹ (классы ΠΈΠ»ΠΈ массивы). Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат встроСнныС ссылочныС Ρ‚ΠΈΠΏΡ‹ Π² качСствС Ρ‡Π»Π΅Π½ΠΎΠ². Π­Ρ‚ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ сборщиком мусора ΠΈ срСдой выполнСния .NET (хотя Π² C#, Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² C++, Ссли Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ способ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π»ΡŽΠ±Ρ‹Π΅ ограничСния, выполняя арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° указатСлях ΠΈ Π·Π°Ρ‚Π΅ΠΌ разымСновывая ΠΈΡ…).

β–‘ ΠŸΠΎΠΌΠΈΠΌΠΎ объявлСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… частСй ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ для компилятора Ρ„Π»Π°Π³ /unsafe ΠΏΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ.

β–‘ Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСны Π² ссылочныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π»Π΅Π½ΠΎΠ² класса), Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ инструкции fixed.

Ѐиксация Π΄ΠΎΠ½Π½Ρ‹Ρ… Π² ΠΊΡƒΡ‡Π΅

Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ адрСс Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… значСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, Π΄Π°ΠΆΠ΅ Ссли этот Ρ‚ΠΈΠΏ встроСн ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅-Ρ‡Π»Π΅Π½ Π² ссылочный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. Однако Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ объявлСн Π²Π½ΡƒΡ‚Ρ€ΠΈ инструкции fixed. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° этого Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ссылочныС Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π² любоС врСмя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΊΡƒΡ‡Π΅ сборщиком мусора. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Π·Π½Π°Π΅Ρ‚ ΠΎ ссылках C# ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ…, ΠΊΠ°ΠΊ трСбуСтся, Π½ΠΎ ΠΎΠ½ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎΠ± указатСлях. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° Ρ‡Π»Π΅Π½ класса Π² ΠΊΡƒΡ‡Π΅ ΠΈ сборщик мусора ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ вСсь экзСмпляр класса, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ адрСс. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ fixed Π½Π΅ позволяСт сборщику мусора ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ экзСмпляр класса Π²ΠΎ врСмя выполнСния Π±Π»ΠΎΠΊΠ° fixed, гарантируя Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.