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

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

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

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

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

class Program

 static void Main(string[] args) {

  // Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ

  // компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

#if DEBUG

  Console.WriteLine("ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния: {0}", Environment.CurrentDirectory);

  Console.WriteLine("Π‘Π»ΠΎΠΊ: {0}", Environment.MachineName);

  Console.WriteLine("ОБ: {0}", Environment.OSVersion);

  Console.WriteLine("ВСрсия .NET: {0}", Environment.Version);

#endif

 }

}

Π—Π΄Π΅ΡΡŒ выполняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° символ DEBUG. Если ΠΎΠ½ присутствуСт, выводится ряд Π΄Π°Π½Π½Ρ‹Ρ… состояния, для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ статичСскиС Ρ‡Π»Π΅Π½Ρ‹ класса System.Environment. Если символ DEBUG Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ #if ΠΈ #endif, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π½Π΅ Π²ΠΎΠΉΠ΄Π΅Ρ‚, Ρ‚.Π΅. Π±ΡƒΠ΄Π΅Ρ‚ фактичСски ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Visual Studio 2005 всСгда опрСдСляСт символ DEBUG, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ снятия ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ„Π»Π°ΠΆΠΊΠ° Define DEBUG constant (ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ константу DEBUG) Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Build (Π‘Π±ΠΎΡ€ΠΊΠ°), Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΉ Π½Π° страницС Properties (Бвойства) вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ символ DEBUG ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ этот символ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ прСпроцСссора #define.

#define DEBUG using System;

namespace Preprocessor {

 class ProcessMe {

  static void Main(string[] args) {

   // ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅β€¦

}

 }

}

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #define Π² Ρ„Π°ΠΉΠ»Π΅ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ C# Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π΄ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ….

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ свои собствСнныС символы прСпроцСссора. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ класс C#, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π°Ρ‡Π΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… дистрибутива Mono.NET (см. Π³Π»Π°Π²Ρƒ 1). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ #define, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ символ MONO_BUILD для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

#define DEBUG

#define MONO_BUILD

using System;

namespace Preprocessor {

 class Program {

  static void Main (string[] args) {

#if MONO_BUILD

   Console.WriteLine("ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ для Mono!");

#else

   ConsΠΎlΠ΅.WriteLine("ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ для Microsoft .NET");

#endif

  }

 }

}

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ символ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ΠΉ для всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ тСкстовый Π±Π»ΠΎΠΊ Conditional compilation symbols (Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ условной компиляции, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Build (Π‘Π±ΠΎΡ€ΠΊΠ°) страницы свойств ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (рис. 9.6).

Рис. 9.6. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ символа прСпроцСссора для примСнСния Π² Ρ€Π°ΠΌΠΊΠ°Ρ… всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

РСзюмС

ЦСлью этой Π³Π»Π°Π²Ρ‹ являСтся Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ возмоТностСй языка программирования C#. Π“Π»Π°Π²Π° Π½Π°Ρ‡Π°Π»Π°ΡΡŒ с обсуТдСния ряда достаточно слоТных конструкций программирования (ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² индСксатора, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ прСобразования). Π—Π°Ρ‚Π΅ΠΌ Π±Ρ‹Π» рассмотрСн нСбольшой Π½Π°Π±ΠΎΡ€ Π½Π΅ слишком ΡˆΠΈΡ€ΠΎΠΊΠΎ извСстных ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ sizeof, checked, unsafe ΠΈ Ρ‚.Π΄.), обсуТдСниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… СстСствСнно ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ вопросов нСпосрСдствСнной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ указатСля. ΠŸΡ€ΠΈ исслСдовании Ρ‚ΠΈΠΏΠΎΠ² указатСля Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ C# для использования Ρ‚ΠΈΠΏΠΎΠ² указатСля Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости.

ГЛАВА 10. ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ

Π‘ появлСниСм .NET 2.0 язык программирования C# стал ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ CTS (Common Type System – общая систСма Ρ‚ΠΈΠΏΠΎΠ²), Π½Π°Π·Π²Π°Π½Π½ΡƒΡŽ обобщСниями (generics). Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ говоря, обобщСния ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ программисту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ опрСдСлСния "Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΉ" (Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ°) для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π²ΠΎ врСмя Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ создании ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π‘ Ρ†Π΅Π»ΡŒΡŽ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этой Π½ΠΎΠ²ΠΎΠΉ возмоТности языка ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ Π³Π»Π°Π²Ρƒ с рассмотрСния пространства ΠΈΠΌΠ΅Π½ System.Collections.Generic. РассмотрСв ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части этой Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ попытаСмся Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свои собствСнныС обобщСния Ρ‡Π»Π΅Π½ΠΎΠ², классов, структур, интСрфСйсов ΠΈ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ².

Π‘Π½ΠΎΠ²Π° ΠΎ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ², восстановлСнии Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ System.Object

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π² Ρ‡Π΅ΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ прСимущСства использования ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ, слСдуСт Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Ρƒ программиста Π±Π΅Π· ΠΈΡ… использования. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 3, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° .NET ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ автоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² стСка ΠΈ динамичСской памяти с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΈ восстановлСния ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π°. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ каТСтся Π½Π΅ слишком ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ, скорСС, тСорСтичСский, Ρ‡Π΅ΠΌ практичСский интСрСс. Но Π½Π° самом Π΄Π΅Π»Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΈ восстановлСния ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° позволяСт ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС, ΠΊΠ°ΠΊ System.Object, оставив всС Π·Π°Π±ΠΎΡ‚Ρ‹ ΠΎ распрСдСлСнии памяти Π½Π° усмотрСниС CLR.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ особСнности процСсса создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π°, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ создали System.Collections.ArrayList для хранСния числовых (Ρ‚.Π΅. Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π² стСкС) Π΄Π°Π½Π½Ρ‹Ρ…. Напомним, Ρ‡Ρ‚ΠΎ всС Ρ‡Π»Π΅Π½Ρ‹ ArrayList ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°ΠΌΠΈ для получСния ΠΈ возвращСния Ρ‚ΠΈΠΏΠΎΠ² System.Object. Но вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ программиста Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ Π² стСкС Ρ†Π΅Π»ΠΎΠ΅ число Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ, срСда выполнСния Π΄Π΅Π»Π°Π΅Ρ‚ это автоматичСски с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π°.

static void Main(string[] args) {

 // ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½Ρƒ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, для

 // Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… значСниями Ρ‚ΠΈΠΏΠΎΠ² автоматичСски создаСтся

 // ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·.

 ArrayList myInts = new ArrayList();

 myInts.Add(10);

 Console.ReadLine();

}

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ArrayList, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ индСксатор Ρ‚ΠΈΠΏΠ°, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² динамичСской памяти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ Π² стСкС Ρ†Π΅Π»ΠΎΠ΅ число, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ прСобразования.

static void Main(string[] args) {

 β€¦

 // Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ восстанавливаСтся… ΠΈ снова становится ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ!

 Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вашСго int: {0}", (int)myInts[0]);

 Console.ReadLine();

}

Для прСдставлСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… CIL компилятор C# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±Π»ΠΎΠΊ box. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ опСрация восстановлСния ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° прСобразуСтся Π² CIL-Π±Π»ΠΎΠΊ unbox. Π’ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ CIL-ΠΊΠΎΠ΄ для ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Main() (этот ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ildasm.exe).

.method private hidebysig static void Main(string[] args) cil managed {

 β€¦

 box [mscorlib]System.Int32

 callvirt instance int32 [mscorlib] System.Collections.ArrayList::Add(object)

 pop

 ldstr "Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ вашСго int: {0}"

 ldloc.0

 ldc.i4.0

 callvirt instance object [mscorlib] System.Collections.ArrayList::get_Item(int32)

 unbox [mscorlib]System.Int32

ldind.i4

 box [mscorlib]System.Int32

call void [mscorlib]System.Console::WriteLine(string, object)

 β€¦

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ. Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ArrayList.Add() Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ Π² стСкС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ System.Int32 прСобразуСтся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ System.Object. Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈΠ· ArrayList с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСксатора Ρ‚ΠΈΠΏΠ° (Ρ‡Ρ‚ΠΎ отобраТаСтся Π² скрытый ΠΌΠ΅Ρ‚ΠΎΠ΄ get_Item()) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System.Object восстанавливаСтся Π² System.Int32 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ снова ΡΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Console.WriteLine().

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈ восстановлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈ восстановлСния ΠΈΠ· Π½ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ Π·Ρ€Π΅Π½ΠΈΠΈ программиста, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ элСмСнтами стСка ΠΈ динамичСской памяти ΠΈΠΌΠ΅Π΅Ρ‚ свои спСцифичСскиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΉ бСзопасности. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходится Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° ΠΈ восстановлСнии значСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа.

1. Новый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² управляСмой динамичСской памяти.

2. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π² стСкС Π΄Π°Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ мСсто Π² памяти.

3. ΠŸΡ€ΠΈ восстановлСнии Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, сохранСнного Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΌ Π² динамичСской памяти, это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ снова Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π² стСк.

4. ΠΠ΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² управляСмой динамичСской памяти (Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ²) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ сборщиком мусора.