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

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

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

  public Tree(){}

  // ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово new ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ здСсь явно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ

  // Π±Π°Π·ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ

  new public void BearFruit() {

   Console.WriteLine("Tree fruit is:->Mango");

  }

 }

 public class PlantEX {

  public PlantEX(){}

  public static void Main(String[] args) {

   Plant p = new Plant();

   p.BearFruit(); // Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса

   Tree t = new Tree();

   t.BearFruit(); // Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса наслСдника

   ((Plant)t).BearFruit(); // Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса,

                           // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ наслСдника.

  }

 }

}

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создаСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄:

Generic plant fruit

Tree fruit is:->Mango

Generic plant fruit

НСобходимо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сущСствуСт Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ сокрытиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠΎΠΌ. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ класса-наслСдника.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’ΠΎ врСмя написания этой ΠΊΠ½ΠΈΠ³ΠΈ Π°Π²Ρ‚ΠΎΡ€ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ», Ρ‡Ρ‚ΠΎ сокрытиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° компилируСтся Π±Π΅Π· ошибок ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово new Π½Π΅ Π±Ρ‹Π»ΠΎ использовано.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ пСрСопрСдСлСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ virtual ΠΈ override. ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ…, Π² классС-наслСдникС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово override. НиТС прСдставлСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ класса Tree, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

class Tree Plant {

 public Tree() {}

 public override void Fruit() {

  Console.WriteLine("Tree fruit is:->Mango");

 }

}

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄.

Generic plant fruit

Tree fruit is:->Mango

Tree fruit is:->Mango

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, вызываСтся самый послСдний ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Fruit() нСзависимо ΠΎΡ‚ использования cΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΠΈ прСобразования ((Plant)t).BearFruit(), которая ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ Ρ€Π°Π½Π΅Π΅ для ссылки Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ Fruit() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ new ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сокрытия любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° наслСдованных ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Ρ‡Π»Π΅Π½ΠΎΠ² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ сигнатуры.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ случайному наслСдованию класса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово sealed. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ·Π΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ объявлСниС Plant Π½Π° public sealed class Plant ΠΈ Π² этом случаС Tree большС Π½Π΅ смоТСт ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ.

C# Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° native. Π’ Java использованиС native ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° зависимом ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ языкС. Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Ρ‹Π» абстрактным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ рСализация Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС. Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠΌ ΠΊ этому Ρ‚ΠΈΠΏΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ являСтся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ extern. ИспользованиС extern ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ рСализуСтся Π²ΠΎΠ²Π½Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ собствСнной DLL). Однако Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Java, Π½Π΅Ρ‚ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово abstract Π² соСдинСнии с Π½ΠΈΠΌ. ЀактичСски это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π΄Π²Π΅ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅, Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ. НиТС класс Plant ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ extern:

public class Plant : IfruitHaver {

 public extern int See();

 public Plant(){}

 public void Fruit() {

  Console.WriteLine("Generic plant fruit");

 }

}

Π­Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ большого смысла Π±Π΅Π· использования Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° DllImport для опрСдСлСния внСшнСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΠΏΠΎΠ·ΠΆΠ΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠΉ ΠΊΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния, прСдполагая, Ρ‡Ρ‚ΠΎ функция See экспортирована рСсурсом User32.dll:

public class Plant: IfruitHaver {

 [System.Runtime.InteropServices.DllImport("User32.dll)]

 public static extern int See();

 public Plant(){}

 public void Fruit() {

  Console.WriteLine("Generic plant fruit");

 }

}

Π—Π΄Π΅ΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ See() ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ статичСский. Атрибут DllImport Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ этого ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

Пока Π½Π΅ сущСствуСт вСрсии C# ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов transient, volatile ΠΈΠ»ΠΈ synchronized. Однако сущСствуСт ряд способов, прСдоставляСмых SDK .NET для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. C# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ NonSerialized, связанный с полями класса, для прСдоставлСния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ Java transient, этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ΄Π½Π°ΠΊΠΎ опротСстован, поэтому ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях.

Бинхронизация Π² C# нСсколько услоТнСна (Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠ°) ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΅Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ Π² Java. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, любой ΠΏΠΎΡ‚ΠΎΠΊ выполнСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠΎ всСм Ρ‡Π»Π΅Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ ряд способов синхронизации ΠΊΠΎΠ΄Π° Π² зависимости ΠΎΡ‚ потрСбностСй Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ использования Ρ‚Π°ΠΊΠΈΡ… срСдств, ΠΊΠ°ΠΊ Monitors. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ синхронизации Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… SyncBlocks, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ синхронизированных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°; список ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выполнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° ReaderWriterLock, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΠΎΠ΄Π½ΠΎΠ³ΠΎ писатСля для многочислСнных Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ; ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации Mutex, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅ΠΆΠΏΡ€ΠΎΡ†Π΅ΡΡΠ½ΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ; ΠΈ System.Threading.Interlocked, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для прСдоставлСнии синхронизированного доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ‡Π΅Ρ€Π΅Π· нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выполнСния.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг ΠΊ синхронизации Π² C# состоит Π² ссылкС Π½Π° сборку System.EnterpriseServices.dll. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ lock(<expression>) {// Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°} являСтся СдинствСнным, связанным с синхронизациСй, ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом Π² C#. Оно ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ Π² Java, для получСния Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ доступа ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° <ref>. ВсС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ <expression> Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ выполнСния с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π½Π΅ освободит Π΅Π΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ this, Π»ΠΈΠ±ΠΎ System.Type, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Type прСдставлСнного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜Ρ… использованиС Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ экзСмпляра выраТСния Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ использованиС System.Type Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок: catch, finally, throw, throws, try

Π­Ρ‚ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Π² ΠΎΠ±ΠΎΠΈΡ… языках, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ инструкции throws, которая отсутствуСт Π² C#. ΠŸΡƒΠ³Π°ΡŽΡ‰Π°Ρ Π²Π΅Ρ‰ΡŒ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ инструкции throws ΠΈΠ· Java состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° позволяСт потрСбитСлям ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простого синтаксиса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π½Π΅ зная ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ. МоТно ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ завСрСниями, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ Π΄Π΅Π»Ρƒ, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Π°Ρ‡Π΅ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΠΎ всСх Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ…. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° отсутствуСт Π² C# Π² настоящСС врСмя. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° потрСбитСлям сборки, ΠΆΠ΅Π»Π°ΡŽΡ‰Π΅ΠΌ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ привСсти ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ докумСнтирования ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΡƒΠΌΠ΅Π»ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вычислСний ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ, Π³Π΄Π΅ вычислСнный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ Java, Ссли Ρ†Π΅Π»Ρ‹Π΅ значСния Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‚ своих ΠΏΡ€Π΅Π΄Π΅Π»ΠΎΠ², Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это, рассмотрим ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ класса:

// OverflowEX.java

public class OverfTowEX {

 publiс static void main(String args []) {

  byte x = 0;

  for (int i = 0; i < 130; i++) {

   x++;

   System.out.println(x);

  }

 }

}

Как извСстно, byte Π² Java являСтся 8-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… со Π·Π½Π°ΠΊΠΎΠΌ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ byte Π»Π΅ΠΆΠΈΡ‚ ΠΎΡ‚ -128 Π΄ΠΎ 128. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ добавлСния Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΠΊ любой Π³Ρ€Π°Π½ΠΈΡ†Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ другая Π³Ρ€Π°Π½ΠΈΡ†Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ 1 ΠΊ 127 создаст -128. И Ссли ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ послСдниС ΠΏΡΡ‚ΡŒ чисСл Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½Π° консоли Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ:

126

127

-128

-127

-126

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ вСсьма сущСствСнной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, особСнно Π² связи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ событиС (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сохраняя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚ΠΈΠΏΠ΅ с большим Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ C# Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ситуации пСрСполнСния, Π½ΠΎ язык ΠΈ компилятор ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ инструмСнты для явной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ увСдомлСния программиста Π² случаС пСрСполнСния.

β–‘ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π§Ρ‚ΠΎΠ±Ρ‹ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с этим Ρ‚ΠΈΠΏΠΎΠΌ ΠΌΠΎΠ»Ρ‡Π°Π»ΠΈΠ²Ρ‹Ρ… ошибок, C# Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ провСряСмых ΠΈ нСпровСряСмых инструкций. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово checked ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для управлСния контСкстом ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пСрСполнСния Π² случаС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ прСдставлСнныС Π²Ρ‹ΡˆΠ΅. Оно ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ инструкция. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ checked/unchecked ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π½ΠΈΠΆΠ΅ синтаксису (i). Они ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для помСщСния Π² скобки ряда инструкций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Бинтаксис ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ checked/unchecked ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ (ii). ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ checked провСряСт ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ: