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

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

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

  }

 }

 set {

  if (a.Equals("Age") {

   age = int.Parse(value);

  }

  else {

   listener(a+ " is read only or does not exist");

  }

 }

}

ЭкзСмпляр Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°, связанный с ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ событий, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ создаСтся. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ созданиС экзСмпляра Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ происходит Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ потрСбляСт это событиС. Для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° событиС прСдставляСтся ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ ΠΏΠΎΠ»Π΅, Π½ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. ЕдинствСнными Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ дСйствиями ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ полю события ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

β–‘ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π² событии Π½ΠΎΠ²Ρ‹Ρ… экзСмпляров Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ²

β–‘ Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ экзСмпляров Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΈΠ· события

C# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ += ΠΈ -= соотвСтствСнно для добавлСния ΠΈ удалСния экзСмпляров Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΈΠ· событий. Оба ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ Π² C# ΠΈ Java. НСдопустимо Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ событиС, Ρ€Π°Π²Π½Ρ‹ΠΌ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π»ΡŽΠ±ΠΎΠΌΡƒ экзСмпляру Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°. ВмСсто этого ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² событиС ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ², сколько понадобится. Π­Ρ‚ΠΎ свободно транслируСтся Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ количСство ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² событий для ΠΎΠ΄Π½ΠΎΠ³ΠΎ события. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

public delegate void TestEvent();

public class Tester {

 public event TestEvent testEvent;

 Tester() { }

 public void Perform() {

  testEvent();

 }

 public class Client {

  Client() {

   Tester tester = new Tester();

   TestEvent a = new TestEvent(Callback1); // сначала ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°

   tester.testEvent += a; // Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ

   tester.testEvent += new Test(CallBack2); // ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это

                                            // Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄

   tester.testEvent += new Test(Callback3);

   tester.testEvent += new Test(Callback4);

   tester.Perform();

  }

  public void CallBack1() {

   // ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· e-mail)

  }

  public void CallBack2() {

   // ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ факсы

  }

  public void CallBack3() {

   // ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ бСспроводноС сообщСниС

  }

  public void CallBack4() {

   // ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅

  }

 }

}

Как ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ события класса, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² классС подписчиков для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ события (ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρ‹), Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ события Π² событиС. Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ Notify():

public static void Notify(string i) {

 Console.WriteLine(i);

}

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ сигнатуру, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ событий класса Properties. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Notify() ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ условно ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ событиС:

Properties props = new Properties("hello"); // Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий

props.ExceptionEventListener += new ExceptionEventListener(test);

p["Aged"] = "35"; // Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

                  // для модСлирования ошибки

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

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² C# Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² Java. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ C# try-catch ΠΈ try-catch-finally Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ своим Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ Π² Java (смотритС Ρ€Π°Π·Π΄Π΅Π» ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… словах). Однако Π² C# нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ throws, поэтому Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сторонС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΆΠ΅ имССтся try-finally, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ подавляСт ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π½ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π±Π»ΠΎΠΊ finally, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ послС пороТдСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ произвСсти очистку.

ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции throw. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ SystemException, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ΄ throw new SystemException (<arg-list>);. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совпадаСт c Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ пороТдаСтся Π² Java. ВрСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ инструкция throws ΠΈ подходящий класс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π”Π°Π»Π΅Π΅ прСдставлСн список Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… стандартных классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, прСдоставляСмых срСдой выполнСния .NET. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π² Java, ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ отраТаСтся Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌ ΠΈΠΌΠ΅Π½Π°Ρ…:

β–‘ Exception β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

β–‘ SystemException β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для всСх ошибок, создаваСмых Π²ΠΎ врСмя выполнСния.

β–‘ IndexOutOfRangeException Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° индСкс массива Π²ΠΎ врСмя выполнСния оказываСтся Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ† Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

β–‘ NullReferenceException пороТдаСтся, ΠΊΠΎΠ³Π΄Π° Π²ΠΎ врСмя выполнСния ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° null.

β–‘ InvalidOperationException пороТдаСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ дСйствитСлСн для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

β–‘ ArgumentException β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс всСх ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

β–‘ ArgumentNullException пороТдаСтся Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ null, ΠΊΠΎΠ³Π΄Π° это нСдопустимо.

β–‘ InteropException являСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈΠ»ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° срСды Π²Π½Π΅ CLR.

Одним ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ‚, являСтся System.OverflowException, связанноС с вычислСнными Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ, прСвосходящими Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ checked ΠΈ unchecked ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π°Π²Π»ΡΡ‚ΡŒ связанныС с этим ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация ΠΎ checked ΠΈ unchecked находится Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… словах.

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

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

csc /define:TEST_TEST samples.cs

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ символы Π½Π° страницС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… свойств ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, добавляя ΠΈΡ… Π² Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ двоСточиями список констант условной компиляции. Или ΠΏΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #define. Π’ этом случаС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‡Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΈ примСняСтся ΠΊΠΎ всСм лСксСмам Π² области дСйствия Ρ„Π°ΠΉΠ»Π°. Π—Π΄Π΅ΡΡŒ пСрСчислСны допустимыС условныС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:

β–‘ #if ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сущСствования символа

β–‘ #elif позволяСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько Π²Π΅Ρ‚Π²Π΅ΠΉ ΠΊ инструкции #if

β–‘ #else прСдоставляСт ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ условиС для #if ΠΈ #elif

β–‘ #endif Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ #if

namespace Samples {

 using System;

#if EXAMPLE

 public class Example {

  public Example() {

  }

 }

#elif TEST_TEST

 public class Test {

  public Test() {

  }

 }

#else

 public class None {

  public None() {

  }

 }

#endif

}

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ инструкции #define TEST_TEST Π΄Π΅Π»Π°Π΅Ρ‚ класс Test Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ для компиляции, a #define EXAMPLE Π΄Π΅Π»Π°Π΅Ρ‚ класс Example Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ для компиляции. Если Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ класс None. Для прСпроцСссора C# доступны Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ β€” #warning ΠΈ #error. Они Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ #if. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΏΠΎΠ΄ инструкциСй #else Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

#warning I wouldn't try to instantiate the example object if I were you

C# Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π’ ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ условного Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π² AMethod() Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ символ Test:

[conditional("TEST_TEST")]

public void AMethod() {

 string s = "I am available only when Test is defined";

}

Вопросы бСзопасности

Π’ настоящСС врСмя ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников. Π’ Java, Π΄ΠΎ появлСния Java 2, сущСствовала установка, Ρ‡Ρ‚ΠΎ всС прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС свойства языка, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ. ΠŸΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΡ‹Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно опасным. Java Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ прСдоставляСт слуТбы ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° java.policy. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ бСзопасности, Ρ‡Ρ‚ΠΎ ΠΈ Π°ΠΏΠΏΠ»Π΅Ρ‚Ρ‹. ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° бСзопасности ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· policytool для создания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ограничСния. Π‘Ρ€Π΅Π΄Π° .NET для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ систСму бСзопасности доступа ΠΊ ΠΊΠΎΠ΄Ρƒ, которая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ рСсурсам ΠΈ опСрациям. НиТС прСдставлСн список Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ систСмы бСзопасности доступа ΠΊ ΠΊΠΎΠ΄Ρƒ: