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

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

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

static void Main(string[] args) {

 β€¦

 // НСвыровнСнный массив MD (Ρ‚.Π΅. массив массивов).

 // Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ массив ΠΈΠ· 5 Ρ€Π°Π·Π½Ρ‹Ρ… массивов.

 int[][] myJagArray = new int[5][];

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠ³ΠΎ массива.

 for (int i = 0; i β€Ή myJagArray.Length; i++) myJagArray[i] = new int[i +7];

 // ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки (Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ

 // ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС элСмСнты Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ!)

 for (int i = 0; i β€Ή 5; i++) {

  Console.Write("Π”Π»ΠΈΠ½Π° строки {0} Ρ€Π°Π²Π½Π° {1}:\t", i, myJagArray[i].Length);

  for (int j = 0; j β€Ή myJagArray[i].Length; j++) Console.Write(myJagArray[i][j] + " ");

  Console.WriteLine();

 }

}

На рис. 3.23 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ здСсь массив ΠΈΠΌΠ΅Π΅Ρ‚ "Π½Π΅Ρ€ΠΎΠ²Π½Ρ‹ΠΉ ΠΊΡ€Π°ΠΉ").

Рис. 3.23. НСвыровнСнный массив

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ массивы Π² C#, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс любого массива: System.Array.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс System.Array

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ создаваСмый Π²Π°ΠΌΠΈ массив Π² .NET автоматичСски получаСтся ΠΈΠ· System.Array. Π­Ρ‚ΠΎΡ‚ класс опрСдСляСт Ρ€Π°Π΄ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами. Π’ Ρ‚Π°Π±Π». 3.14 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ΡΡ описания Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсных Ρ‡Π»Π΅Π½ΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ класса.

Π’Π°Π±Π»ΠΈΡ†Π° 3.14. НСкоторыС Ρ‡Π»Π΅Π½Ρ‹ System.Array

Π§Π»Π΅Π½ ОписаниС BinarySearch() БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ поиск Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта Π² (ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отсортированном) массивС. Если массив скомпонован ΠΈΠ· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², искомый Ρ‚ΠΈΠΏ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйс IComparer (см. Π³Π»Π°Π²Ρƒ 7), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск Clear() БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΡ‡ΠΈΡ‰Π°ΡŽΡ‰ΠΈΠΉ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ элСмСнтов Π² массивС (устанавливаСтся 0 для числовых Ρ‚ΠΈΠΏΠΎΠ² ΠΈ null – для ссылочных Ρ‚ΠΈΠΏΠΎΠ²) CopyTo() ΠœΠ΅Ρ‚ΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для копирования элСмСнтов ΠΈΠ· массива-источника Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ массив Length Бвойство, доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для выяснСния числа элСмСнтов Π² массивС Rank Бвойство, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ размСрности Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива Reverse() БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ порядок слСдования элСмСнтов ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Sort() ΠœΠ΅Ρ‚ΠΎΠ΄, ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Если элСмСнты Π² массивС Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс IComparer, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ (снова см. Π³Π»Π°Π²Ρƒ 7)

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использовании Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· этих Ρ‡Π»Π΅Π½ΠΎΠ². Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Reverse() ΠΈ Clear() (Π° Ρ‚Π°ΠΊΠΆΠ΅ свойство Length) для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ массивС строк firstNames Π½Π° консоль.

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ строковых массивов ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

// Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² System.Array.

static void Main(string[] args) {

 // Массив строк.

 string[] firstNames = {"Steve", "Dominic", "Swallow", "Baldy"};

 // ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ Π² объявлСнном Π²ΠΈΠ΄Π΅.

 Console.WriteLine("Π’ΠΎΡ‚ Π²Π°ΠΌ массив:");

 for(int i = 0; i β€Ή firstNames.Length; i++) Console.Write("Имя: {0}\t", firstNames[i]);

 Console.WriteLine("\n");

 // Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ порядка Π² массивС ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ.

 Array.Reverse(firstNames);

 Console.WriteLine("Π’ΠΎΡ‚ Π²Π°ΠΌ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив:");

 for (int i = 0; i β€Ή firstNames.Length; i++) Console.Write("Имя: (0}\t", firstNames[i]);

 Console.WriteLine("\n");

 // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° всСх Π΄Π°Π½Π½Ρ‹Ρ…, Ρ…Ρ€ΠΎΠΌΠ΅ Baldy.

 Console.WriteLine("ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° всСх Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΡ€ΠΎΠΌΠ΅ Baldy…");

 Array.Clear(firstNames, 1, 3);

 for (int i = 0; i β€Ή firstNames.Length; i++) Console.Write ("Имя: {0}\t", firstNames[i]);

 Console.ReadLine();

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Clear() для массива ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ элСмСнты массива Π½Π΅ ΡΠΆΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π² мСньший массив. Для ΠΏΠΎΠ΄Π²Π΅Ρ€Π³ΡˆΠΈΡ…ΡΡ очисткС элСмСнтов просто ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ динамичСского Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ подходящий Ρ‚ΠΈΠΏ Π² пространствС ΠΈΠΌΠ΅Π½ System.Collections.

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

Π’ΠΈΠΏΡ‹ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null

Π’Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… CLR ΠΈΠΌΠ΅ΡŽΡ‚ фиксированный Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ измСнСния. НапримСр, Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… System.Boolean ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния ΠΈΠ· мноТСства {true, false}. Π’ .NET 2.0 ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null (Ρ‚ΠΈΠΏΡ‹ nullable). Π’ΠΈΠΏ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, допустимоС для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null. Π’Π°ΠΊ, Ссли ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ System.Boolean с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ смоТСт ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния ΠΈΠ· мноТСства {true, false, null}. ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π±Π΅Π· Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚.

static void Main(string[] args) {

 // Ошибка компиляции!

 // Π’ΠΈΠΏΡ‹, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ null!

 bool myBool = null;

 int myInt = null;

}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° nullable, ΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ суффикса добавляСтся Π·Π½Π°ΠΊ вопроса (?). Π’Π°ΠΊΠΎΠΉ синтаксис оказываСтся допустимым Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… значСниями, ΠΈΠ»ΠΈ массивах Ρ‚Π°ΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ссылочный Ρ‚ΠΈΠΏ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ строковый) с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ значСния null Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции. Подобно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π±Π΅Π· Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ с Ρ‚Π°ΠΊΠΈΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния.

static void Main(string [] args) {

 // НСсколько ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

 // с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ значСниями null.

 int? nullableInt = 10;

 double? nullableDouble = 3.14;

 bool? nullableBool = null;

 char? nullableChar = 'a';

 int?[] arrayOfNullableInts = new int?[10];

 // Ошибка! Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ!

 string? s = "ΠΎΠΉ!";

}

Буффикс ? Π² C# являСтся сокращСнной записью для указания ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ структуры ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° System.Nullableβ€ΉTβ€Ί. ΠœΡ‹ рассмотрим ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ Π² Π³Π»Π°Π²Π΅ 10, Π° сСйчас Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ System.NullablΠ΅β€ΉΠ’β€Ί ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ряд Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Ρ‚ΠΈΠΏΡ‹ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ значСния null. НапримСр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойство HasValue ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ !=, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, содСрТит Π»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ пСрСмСнная Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, присвоСнноС Ρ‚ΠΈΠΏΡƒ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ значСния null, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ нСпосрСдствСнно ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства Value.

Π Π°Π±ΠΎΡ‚Π° с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… допустимы значСния null

Π’ΠΈΠΏΡ‹ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ взаимодСйствии с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ столбцы Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ пустыми (Ρ‚.Π΅., Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ). Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ класс, ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ, Π΄Π²Π° столбца ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ здСсь ΠΌΠ΅Ρ‚ΠΎΠ΄ GetIntFromDatabase() Π½Π΅ присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρƒ-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ цСлочислСнного Ρ‚ΠΈΠΏΠ° с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ null, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ GetBoolFromDatabase() Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ подходящСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρƒ bool?.

Class DatabaseReader {

 // ПолС Π΄Π°Π½Π½Ρ‹Ρ… с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ значСния null.

 public int? numbericValue;

 public bool? boolValue = true;

 // ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ null для Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

 public int? GetIntFromDatabase() {return numberiсVΠ°lue;}

 // ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ null для Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

 public bool? GetBoolFromDatabase() {return boolValue;}

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Main(), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ‡Π»Π΅Π½Ρ‹ класса DatabaseReader ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ присвоСнныС ΠΈΠΌ значСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ HasValue ΠΈ Value Π² соотвСтствии с синтаксисом C#.

static void Main(string[] args) {

 Console.WriteLine("***** Π—Π°Π±Π°Π²Ρ‹ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ null *****\n")

 DatabaseReader dr = new DatabaseReader();

 // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ int ΠΈΠ· 'Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…'.

 int? i = dr.GetIntFromDatabase();

 if (i.HasValue) Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'i' Ρ€Π°Π²Π½ΠΎ: {0}", i);

 else Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'i' Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.");

 // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ bool ΠΈΠ· 'Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…'.

 bool? b = dr.GetBoolFromDatabase();

 if (b != null) Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'b' Ρ€Π°Π²Π½ΠΎ: {0}", b);

 else Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'b' Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.");

 Console.ReadLine();

}

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ??