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

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

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

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

Π’Ρ‹, нСсомнСнно, прСкрасно Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ любой числовой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ свои строго Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΠΈ Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ (значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ срСдствами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойств MaxValue ΠΈ MinValue). ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ случайноС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° хранСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° присвоСния Ρ‚ΠΈΠΏΡƒ значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ оказываСтся большС максимально допустимого) ΠΈΠ»ΠΈ потСря значимости (ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° присвоСния значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ оказываСтся мСньшС минимально допустимого). Π§Ρ‚ΠΎΠ±Ρ‹ "ΠΈΠ΄Ρ‚ΠΈ Π² Π½ΠΎΠ³Ρƒ" с CLR, ΠΎΠ±Π΅ эти возмоТности Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ "ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅". (И ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΈ потСря значимости приводят ΠΊ созданию Ρ‚ΠΈΠΏΠ° System.OverflowException. Π’ΠΈΠΏΠ° System.UnderflowException Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π½Π΅Ρ‚.)

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создали Π΄Π²Π° экзСмпляра Ρ‚ΠΈΠΏΠ° System.Byte (Ρ‚ΠΈΠΏ byte Π² C#), присвоив ΠΈΠΌ значСния, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ максимального (255). ΠŸΡ€ΠΈ слоТСнии Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ этих Ρ‚ΠΈΠΏΠΎΠ² (с условиСм прСобразования Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² Ρ‚ΠΈΠΏ byte) Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ суммой ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ².

namespace CheckedUnchecked {

 class Program {

  static void Main(string[] args) {

   // ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ для System.Byte.

   Console.WriteLine("Макс, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для byte Ρ€Π°Π²Π½ΠΎ {0}", byte.MaxValue);

   Console.WriteLine("Мин. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для byte Ρ€Π°Π²Π½ΠΎ {0}", byte.MinValue);

   byte b1 = 100;

   byte b2 = 250;

   byte sum = (byte)(b1 + b2);

   // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ sum Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ 350, Π½ΠΎ.…

   Console.WriteLine("sum = {0}", sum);

   Console.ReadLine();

  }

 }

}

Π’Ρ‹Π²ΠΎΠ΄ этого прилоТСния ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ sum содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 94 (Π° Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ 350). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΎΡ‡Π΅Π½ΡŒ проста. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ System.Byte ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, находящиСся ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ 255 (Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ составляСт 256 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ), sum Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСполнСния (350 – 256 = 94). Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² отсутствиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ происходит Π±Π΅Π· гСнСрирования ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Иногда скрытоС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ создаСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ потСря Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ.

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ значимости Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π΅ возмоТности. ΠŸΠ΅Ρ€Π²ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ являСтся использованиС программистского ΠΎΠΏΡ‹Ρ‚Π° ΠΈ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всС условия пСрСполнСния Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ всС условия пСрСполнСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

// ИспользованиС int для sum, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ пСрСполнСния.

byte b1 = 100;

byte b2 = 250;

int sum = b1 + b2;

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ – Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΏΡ€ΠΈ всСх Π²Π°ΡˆΠΈΡ… усилиях, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ ошибки, ΡƒΡΠΊΠΎΠ»ΡŒΠ·Π½ΡƒΠ²ΡˆΠΈΠ΅ ΠΎΡ‚ вашСго взгляда. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² C# прСдлагаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово checked. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° (ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²) Π² Ρ€Π°ΠΌΠΊΠΈ контСкста ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова checked компилятор C# Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ CIL-инструкщии, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ условия пСрСполнСния, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ слоТСния, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅, вычитания ΠΈΠ»ΠΈ дСлСния числовых Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Если происходит ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, срСда выполнСния Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ System.OverflowException. РассмотритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

class Program {

 static void Main(string[] args) {

  // ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ для System.Byte.

  Console.WriteLine("Макс. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для byte Ρ€Π°Π²Π½ΠΎ {0}.", byte.MaxValue);

  byte b1 = 100;

  byte b2 = 250;

  try {

   byte sum = checked((byte)(b1 + b2));

   Console.WriteLine("sum = {0}", sum);

  } catch (OverflowException e) { Console.WriteLine(e.Message); }

 }

}

Π—Π΄Π΅ΡΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ слоТСния b1 ΠΈ b2 помСщаСтся Π² контСкст ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова checked. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° пСрСполнСния происходила для Π±Π»ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом checked Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

try {

 checked {

  byte sum = (byte)(b1 + b2);

  Console.WritaLine(sum = {0}", sum);

 }

} catch (OverflowException e) {

 Console.WriteLine(e.Message);

}

Π’ любом случаС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ автоматичСски, ΠΈ Ссли ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирована ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пСрСполнСния для всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Если Π²Ρ‹ создаСтС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ скрытоС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… условиях, Π±ΡƒΠ΄Π΅Ρ‚ слишком ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово checked для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ компилятор C# ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ /checked. Когда этот Ρ„Π»Π°Π³ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, всС арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π΅Π· указания ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова checked. Если обнаруТится ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ OverflowException срСды выполнСния.

Π§Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ„Π»Π°Π³ Π² Visual Studio 2005, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ страницу свойств ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Ρ‰Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ Advanced Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Build. Π’ появившСмся Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Ρ„Π»Π°ΠΆΠΎΠΊ Check for arithmetic overflow/underflow (ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ условия пСрСполнСния/ΠΏΠΎΡ‚Π΅Ρ€ΠΈ значимости для арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ), рис. 9.3.

Рис. 9.Π—. Активизация ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пСрСполнСния Π² Visual Studio 2005

Ясно, Ρ‡Ρ‚ΠΎ эта установка оказываСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС связанныС с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡƒΠ΄Π°Π»Π΅Π½Ρ‹, Ρ„Π»Π°Π³ /checked для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ.

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

Π’ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ пСрСполнСния для всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ для Ρ‚Π΅Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ "молчаливая рСакция" Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ°? ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π»Π°Π³ /checked ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ всСй арифмСтичСской Π»ΠΎΠ³ΠΈΠΊΠΈ, Π² языкС C# прСдлагаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово unchecked, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ System.OverflowException для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… случаСв, ΠŸΡ€Π°Π²ΠΈΠ»Π° использования этого ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ использования ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова checked, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

// Π”Π°ΠΆΠ΅ Ссли Ρ„Π»Π°Π³ /checked Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½,

// этот Π±Π»ΠΎΠΊ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² срСдС выполнСния.

unchecked {

 byte sum = (byte)(b1 + b2);

 Console.WriteLine(sum = {0}", sum);

}

Подводя ΠΈΡ‚ΠΎΠ³Π° обсуТдСния ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов C# checked ΠΈ unchecked, снова ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ срСда выполнСния .NET ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ условии пСрСполнСния, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ использовании арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ сСлСктивно ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ условия пСрСполнСния для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово checked. Если Π½ΡƒΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки пСрСполнСния Π²ΠΎ всСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Ρ„Π»Π°Π³ /checked, НаконСц, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово unchecked, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ (ΠΈ поэтому ΠΎΠ½ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² срСдС выполнСния).

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

Π Π°Π±ΠΎΡ‚Π° с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ указатСля

Из Π³Π»Π°Π²Ρ‹ 8 Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° .NET опрСдСляСт Π΄Π²Π΅ Π³Π»Π°Π²Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…: Ρ‚ΠΈΠΏΡ‹, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ значСниями, ΠΈ Ρ‚ΠΈΠΏΡ‹, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ссылками (ссылочныС Ρ‚ΠΈΠΏΡ‹). Однако, справСдливости Ρ€Π°Π΄ΠΈ., слСдуСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ имССтся ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ катСгория: это Ρ‚ΠΈΠΏΡ‹ указатСля. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ указатСля ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ "ΠΎΠ±ΠΎΠΉΡ‚ΠΈ" схСму управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ CLR ΠΈ "Π²Π·ΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² свои Ρ€ΡƒΠΊΠΈ" (Ρ‚Π°Π±Π». 9.3).

Π’Π°Π±Π»ΠΈΡ†Π° 9.3. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова C# для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с указатСлями

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ОписаниС * Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ указатСля (Ρ‚.Π΅. ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ нСпосрСдствСнно Π°Π΄Ρ€Π΅ΡΡƒΠ΅ΠΌΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π² памяти). Как ΠΈ Π² C(++), Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π·Π½Π°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ разымСнования указатСля (Ρ‚.Π΅, для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎ адрСсу, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ) & Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния адрСса ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² памяти –› Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для доступа ΠΊ полям Ρ‚ΠΈΠΏΠ°, прСдставлСнным ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ (нСбСзопасная вСрсия ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅ΠΌΠΎΠΉ Π² C# Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ) [] ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ [] (Π² нСбСзопасном контСкстС) позволяСт ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ пСрСмСнная указатСля. (ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° аналогию ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ указатСля ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ [] Π² C(++).) ++, -- Π’ нСбСзопасном контСкстС ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ указатСля ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ приращСния ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ приращСния +, - Π’ нСбСзопасном контСкстС ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ указатСля ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния ΠΈ вычитания ==, !=, <, >, <=, >= Π’ нСбСзопасном контСкстС ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ указатСля ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Ρ‚ΠΎΠΆΠ΄Π΅ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ stackalloc Π’ нСбСзопасном контСкстС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово stackalloc, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ массивы C# Π² стСкС fixed Π’ нСбСзопасном контСкстС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово fixed, Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π΅Π΅ адрСс 

ΠŸΠ΅Ρ€Π΅Π΄ рассмотрСниСм Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² использовании Ρ‚ΠΈΠΏΠΎΠ² указатСля Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ, Ссли ΠΎΠ½Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅. Π₯отя C# ΠΈ позволяСт "ΡΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒΡΡ" Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ манипуляций с указатСлями, слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ срСда выполнСния .NET Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ прСдставлСния ΠΎ Π²Π°ΡˆΠΈΡ… намСрСниях. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли Π²Ρ‹ ΠΎΡˆΠΈΠ±Π΅Ρ‚Π΅ΡΡŒ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ указатСля, Ρ‚ΠΎ Π·Π° послСдствия Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ сами. Если ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ это, Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΆΠ΅ Π½Π° самом Π΄Π΅Π»Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования Ρ‚ΠΈΠΏΠΎΠ² указатСля? Π•ΡΡ‚ΡŒ Π΄Π²Π΅ стандартныС ситуации.