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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 86

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

struct Point {

 public int x;

 public int y;

 public override string ToString() { return string.Format ("({0}, {1})", x, y); }

}

static void Main(string[] args) {

 // Доступ ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ.

 unsafe {

  Point point;

  Point* p =&point;

  p-β€Ίx = 100;

  p-β€Ίy = 200;

  Console.WriteLine(p-β€ΊToString());

 }

 // Доступ ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

 unsafe {

  Point point;

  Point* p =&point;

  (*p).x = 100;

  (*p).y = 200;

  Console.WriteLine((*p).ToString());

 }

}

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово stackalloc

Π’ нСбСзопасном контСкстС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ объявлСниС локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠΉ нСпосрСдствСнно Π² памяти стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ "ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ" ΠΏΡ€ΠΈ сборкС мусора .NET). Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ объявлСниС, Π² C# прСдлагаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово stackalloc ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ C#-эквивалСнтом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ alloca ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния C. Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

unsafe {

 char* p = stackalloc char[256];

 for (int k = 0; k β€Ή 256; k++) p[k] = (char)k;

}

Ѐиксация Ρ‚ΠΈΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова fixed

Как ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π°Ρ‡Ρƒ размСщСния элСмСнта Π² памяти Π² Ρ€Π°ΠΌΠΊΠ°Ρ… нСбСзопасного контСкста ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова stackalloc. Π’ силу самой ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ очищаСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ происходит Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° размСщСния (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ выбираСтся ΠΈΠ· стСка). Но рассмотрим Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ процСссС обсуТдСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ -β€Ί Π²Ρ‹ создали Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏ Point. Подобно всСм Ρ‚ΠΈΠΏΠ°ΠΌ, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ значСниями, выдСлСнная для Π½Π΅Π³ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² стСкС освобоТдаСтся сразу ΠΆΠ΅ послС исчСзновСния контСкста выполнСния. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Point Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ ссылочный Ρ‚ΠΈΠΏ.

class Point { //β€Ή= Π’Π΅ΠΏΠ΅Ρ€ΡŒ это класс!

 public int x;

 public int Ρƒ;

 public override string ToString() { return string.Format("({0}, {1})", x, y); }

}

Π’Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сторона ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° Point, для Π½Π΅Π΅ выдСляСтся динамичСская ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΡΠ²Π»ΡΡŽΡ‰Π°ΡΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ для сборки мусора. Π’ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли нСбСзопасный контСкст попытаСтся Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π² динамичСской памяти)? ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сборка мусора ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС всю Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎΡΡ‚ΡŒ доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ Point, ΠΊΠΎΠ³Π΄Π° ΠΈΠ΄Π΅Ρ‚ очистка динамичСской памяти. ВСорСтичСски Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ нСбСзопасный контСкст Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Ρ‡Π»Π΅Π½ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС Π½Π΅ доступСн ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² динамичСской памяти, "ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²" ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ чистки (ΠΈ это, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ).

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ссылочного Ρ‚ΠΈΠΏΠ° Π² памяти ΠΈΠ· нСбСзопасного контСкста, Π² C# прСдлагаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово fixed. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ fixed устанавливаСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° управляСмый Ρ‚ΠΈΠΏ ΠΈ "закрСпляСт" ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π½Π° врСмя выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π‘Π΅Π· ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова fixed Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° управляСмыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΌΠ°Π»ΠΎ смысла, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сборки мусора. Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ нСпрСдсказуСмым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. (На самом Π΄Π΅Π»Π΅ компилятор C# Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ссли Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово fixed.)

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли Π²Ρ‹ создадитС Ρ‚ΠΈΠΏ Point (сСйчас ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ, ΠΊΠ°ΠΊ класс) ΠΈ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ (ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка компиляции).

unsafe public static void Main() {

 point pt = new Point();

 pt.x = 5;

 pt.y = 6;

 // Ѐиксация pt, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ пСрСмСщСния

 // ΠΈΠ»ΠΈ удалСния ΠΏΡ€ΠΈ сборкС мусора.

 fixed (int* p =&pt.x) {

  // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ int* ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ здСсь.

 }

 // Π’Π΅ΠΏΠ΅Ρ€ΡŒ pt Π½Π΅ зафиксирована ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ±Ρ€Π°Π½Π°

 // сборщиком мусора.

 Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Point: {0}", pt);

}

Π’ сущности, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово fixed позволяСт ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π·Π°ΠΊΡ€Π΅ΠΏΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡΡΡ‹Π»ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π΅ адрСс оставался постоянным Π½Π° врСмя выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ бСзопасности ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ фиксируйтС ссылки ΠΏΡ€ΠΈ взаимодСйствии со ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈΠ· нСбСзопасного контСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово sizeof

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ обсуТдСния вопросов, связанных с нСбСзопасным контСкстом Π² C#, рассмотрим ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово sizeof. Как ΠΈ Π² C(++), ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово C# sizeof ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² Π±Π°ΠΉΡ‚Π°Ρ… Ρ‚ΠΈΠΏΠ°, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ значСниями (Π½ΠΎ Π½Π΅ ссылочного Ρ‚ΠΈΠΏΠ°), ΠΈ это ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… нСбСзопасного контСкста. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ указанная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΈ взаимодСйствии с нСуправляСмыми API, созданными Π½Π° Π±Π°Π·Π΅ C. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΎΡ‡Π΅Π½ΡŒ просто.

unsafe {

 Console.WriteLine("Π”Π»ΠΈΠ½Π° short Ρ€Π°Π²Π½Π° {0}.", sizeof(short));

 Console.WriteLine("Π”Π»ΠΈΠ½Π° int Ρ€Π°Π²Π½Π° {0}.", sizeof(int));

 Console.WriteLine("Π”Π»ΠΈΠ½Π° long Ρ€Π°Π²Π½Π° {0}.", sizeof(long));

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ sizeof ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ число Π±Π°ΠΉΡ‚ΠΎΠ² для любого элСмСнта, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ System.ValueType, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… структур. Допустим, ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру.

struct MyValueType {

 public short s;

 public int i;

 public long l;

}

Π’ΠΎΠ³Π΄Π° Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ.

unsafe {

 Console.WriteLine("Π”Π»ΠΈΠ½Π° short Ρ€Π°Π²Π½Π° {0}.", sizeof(short));

 Console.WriteLine("Π”Π»ΠΈΠ½Π° int Ρ€Π°Π²Π½Π° {0}.", sizeof(int));

 Console.WriteLine("Π”Π»ΠΈΠ½Π° long Ρ€Π°Π²Π½Π° {0}.", sizeof(long));

 Console.WriteLine("Π”Π»ΠΈΠ½Π° MyValueType Ρ€Π°Π²Π½Π° {0}."/ sizeof(MyValueType));

}

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ UnsafeCode Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 9.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора C#

Подобно ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ языкам ΠΈΠ· сСмСйства C, Π² C# ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ символы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° процСсс компиляции. ΠŸΠ΅Ρ€Π΅Π΄ рассмотрСниСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора C# согласуСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡŽ. Π’Π΅Ρ€ΠΌΠΈΠ½ "Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора C#" Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ Ρ‚ΠΎΡ‡Π΅Π½. ЀактичСски этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для согласованности с языками программирования C ΠΈ C++. Π’ C# Π½Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ шага прСпроцСссора. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора Π² C# ΡΠ²Π»ΡΡŽΡ‚ΡΡ составной Ρ‡Π°ΡΡ‚ΡŒΡŽ процСсса лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° компилятора.

Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅, синтаксис Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора C# ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° синтаксис ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² сСмСйства C Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ всСгда ΠΈΠΌΠ΅ΡŽΡ‚ прСфикс, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π·Π½Π°ΠΊΠΎΠΌ "Π΄ΠΈΠ΅Π·" (#). Π’ Ρ‚Π°Π±Π». 9.4 описаны Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² (подробности ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ .NET Framework 2.0 SDK).

Π’Π°Π±Π»ΠΈΡ†Π° 9.4. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ прСпроцСссора C#

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ОписаниС #region, #endregion Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для обозначСния Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² стягиваСмого исходного ΠΊΠΎΠ΄Π° #define, #undef Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для опрСдСлСния ΠΈ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ опрСдСлСния символов условной компиляции #if, #elif, #else, #endif Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для условного пропуска Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² исходного ΠΊΠΎΠ΄Π° (Π½Π° основС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… символов компиляции)

Π Π°Π·Π΄Π΅Π»Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора ΡΠ²Π»ΡΡŽΡ‚ΡΡ #region ΠΈ #endregion. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΈ, Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π±Π»ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ просмотра ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ тСкстовым ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΎΠΌ. ИспользованиС Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ обслуТиваниС Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² *.cs. МоТно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·Π΄Π΅Π» для конструкторов Ρ‚ΠΈΠΏΠ°, Π΄Ρ€ΡƒΠ³ΠΎΠΉ – для свойств ΠΈ Ρ‚.Π΄.

class Car {

 private string petName;

 private int currSp;

#region Constructors

 public Car() {…}

 public Car Car(int currSp, string petName) {…}

#endregion

#region Properties

 public int Speed {…}

 public string Name {…}

#endregion

}

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ указатСля ΠΌΡ‹ΡˆΠΈ Π½Π° ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ свСрнутого Ρ€Π°Π·Π΄Π΅Π»Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ снимок ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, спрятанного Π·Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ (рис. 9.5).

Рис. 9.5. Π Π°Π·Π΄Π΅Π»Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ

Условная компиляция

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора (#if, #elif, #else, #endif) позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π±Π»ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, Π±Π°Π·ΠΈΡ€ΡƒΡΡΡŒ Π½Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… символах. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ использования этих Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² являСтся идСнтификация Π±Π»ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ (Π° Π½Π΅ ΠΏΡ€ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅).