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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0 ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство - 2011Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 134

Автор Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π½Π° C++ ΠΈ Java Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ обобщСния Π² C# Π½Π΅ слСдуСт ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с шаблонами Π² C++ ΠΈ обобщСниями Π² Java, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Ρ€Π°Π·Π½Ρ‹Π΅, хотя ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ срСдства. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ этими трСмя ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠΎΡ€Π΅Π½Π½Ρ‹Π΅ различия. Если Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ программирования Π½Π° C++ ΠΈΠ»ΠΈ Java, Ρ‚ΠΎ ΠΏΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° основании этого ΠΎΠΏΡ‹Ρ‚Π° Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π»Π΅ΠΊΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΡ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ обобщСния'Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π‘#.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ

НачнСм рассмотрСниС ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ с простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ класса. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π° класса. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ… являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ класс Gen, Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ β€” класс Generics Demo, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс Gen.

// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ класса, using System;

//Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ классС Gen ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° Π’ замСняСтся // Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° Gen. class Gen<T> {

Π’ ob; // ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° Π’

// ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ этого конструктора имССтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° public Gen(T ΠΎ) { ob = ΠΎ;

}

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ экзСмпляра ob, которая относится ΠΊ Ρ‚ΠΈΠΏΡƒ Π’. public Π’ GetObO { return ob;

}

// ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π’. public void ShowTypeO {

Console.WriteLine("К Ρ‚ΠΈΠΏΡƒ T относится " + typeof (Π’));

}

}

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ класса, class GenericsDemo { static void Main() {

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Gen Ρ‚ΠΈΠΏΠ° int.

Gen<int> iOb;

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Gen<int> ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ссылку Π½Π° Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ iOb iOb = new Gen<int> (102);

// ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ iOb. iOb.ShowType();

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ iOb. int v = iOb.GetOb();

Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: " + v) ;

Console.WriteLine();

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Gen для строк.

Gen<string> strOb = new Gen<string>("ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.");

// ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ strOb. strOb.ShowType();

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ strOb. string str = strOb.GetOb ();

Console.WriteLine("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: " + str);

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

К Ρ‚ΠΈΠΏΡƒ Π’ относится' System.Int32 Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: 102

К Ρ‚ΠΈΠΏΡƒ Π’ относится System.String

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° объявлСниС класса Gen Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ строкС ΠΊΠΎΠ΄Π°:

class Gen<T> {

Π³Π΄Π΅ Π’ β€” это имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ имя слуТит Π² качСствС ΠΌΠ΅Ρ‚ΠΊΠΈ-заполнитСля ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ указываСтся ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, имя Π’ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² классС Gen всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ имя Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки (< >). Π­Ρ‚ΠΎΡ‚ синтаксис ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ: всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ°, ΠΎΠ½ указываСтся Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² классС Gen, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ класс считаСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌ.

Π’ объявлСнии класса Gen ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ любоС имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, Π½ΠΎ ΠΏΠΎ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ выбираСтся имя Π’. К числу Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚ΠΈΠΏΠ° относятся V ΠΈ Π•. Π’Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²ΠΎΠ»ΡŒΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ TValue ΠΈΠ»ΠΈ Π’ΠšΠ΅Ρƒ. Но Π² этом случаС ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° принято ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΠΈΡΠ½ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π’.

Π”Π°Π»Π΅Π΅ имя Π’ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ob, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΊΠΎΠ΄Π°.

Π’ ob; // ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° Π’

Как пояснялось Π²Ρ‹ΡˆΠ΅, имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° Π’ слуТит ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ-Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ пСрСмСнная ob Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ, привязываСмый ΠΊ Π’ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen. Π’Π°ΠΊ, Ссли вмСсто Π’ указываСтся Ρ‚ΠΈΠΏ string, Ρ‚ΠΎ Π² экзСмплярС Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСмСнная ob Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ string.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим конструктор класса Gen.

public Gen(T ΠΎ) { ob = ΠΎ;

}

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΎ этого конструктора относится ΠΊ Ρ‚ΠΈΠΏΡƒ Π’. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎ опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ, привязываСмым ΠΊ Π’ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΎ ΠΈ пСрСмСнная экзСмпляра ob относятся ΠΊ Ρ‚ΠΈΠΏΡƒ Π’, Ρ‚ΠΎ послС создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen ΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ окаТСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° Π’ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetOb ().

public Π’ GetOb()    {

return ob;

}

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ob Ρ‚Π°ΠΊΠΆΠ΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ Π’, поэтому Π΅Π΅ Ρ‚ΠΈΠΏ совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ GetOb ().

ΠœΠ΅Ρ‚ΠΎΠ΄ ShowType () ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π’, пСрСдавая Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ typeof. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ подставляСтся вмСсто Π’ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ typeof ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ Ρ‚ΠΈΠΏΠ΅.

Π’ классС Generics Demo дСмонстрируСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ класса Gen. Π‘Π½Π°Ρ‡Π°Π»Π° Π² Π½Π΅ΠΌ создаСтся Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса Gen для Ρ‚ΠΈΠΏΠ° int.

Gen<int> iOb;

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ это объявлСниС. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ int указываСтся Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках послС ΠΈΠΌΠ΅Π½ΠΈ класса Gen. Π’ этом случаС int слуТит Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ°, привязанным ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° Π’ Π² классС Gen. Π’ Π΄Π°Π½Π½ΠΎΠΌ объявлСнии создаСтся Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса Gen, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚ΠΈΠΏ Π’ замСняСтся Ρ‚ΠΈΠΏΠΎΠΌ int Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΎΠ½ встрСчаСтся. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, послС этого объявлСния int становится Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ob ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetOb ().

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΊΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ iOb присваиваСтся ссылка Π½Π° экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Gen для Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ‚ΠΈΠΏΠ° int.

iOb = new Gen<int> (102);

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ конструктора класса Gen указываСтся Ρ‚Π°ΠΊΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° int. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ пСрСмСнная (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” iOb), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присваиваСтся ссылка, относится ΠΊ Ρ‚ΠΈΠΏΡƒ Gen<int>. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ссылка, возвращаСмая ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ new, Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΈΠΏΡƒ Gen<int>. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎ врСмя компиляции Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка. НапримСр, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ присваиваниС станСт ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ошибки Π²ΠΎ врСмя компиляции.

iOb = new Gen<double>(118.12); // Ошибка!

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ iOb относится ΠΊ Ρ‚ΠΈΠΏΡƒ Gen<int> ΠΈ поэтому Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Gen<double>. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΈΠΏΠΎΠ² относится ΠΊ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π³Π»Π°Π²Π½Ρ‹Ρ… прСимущСств ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ обСспСчиваСт Ρ‚ΠΈΠΏΠΎΠ²ΡƒΡŽ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.

Π—Π°Ρ‚Π΅ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ отобраТаСтся Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ob Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ iOb β€” Ρ‚ΠΈΠΏ System. Int32. Π­Ρ‚ΠΎ структура .NET, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‚ΠΈΠΏΡƒ int. Π”Π°Π»Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ob получаСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΊΠΎΠ΄Π°.

int v = iOb.GetOb ();

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° GetOb () являСтся Ρ‚ΠΈΠΏ Π’, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° Ρ‚ΠΈΠΏ int ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ iOb, ΠΈ поэтому ΠΌΠ΅Ρ‚ΠΎΠ΄ GetOb () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° int. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ v Ρ‚ΠΈΠΏΠ° int.

Π”Π°Π»Π΅Π΅ Π² классС GenericsDemo ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Gen<string>.

Gen<string> strOb = new Gen<string>("ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.");

Π’ этом объявлСнии указываСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° string, поэтому Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ класса Gen вмСсто Π’ подставляСтся Ρ‚ΠΈΠΏ string. Π’ ΠΈΡ‚ΠΎΠ³Π΅ создаСтся Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса Gen для Ρ‚ΠΈΠΏΠ° string, ΠΊΠ°ΠΊ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ строки ΠΊΠΎΠ΄Π° рассматриваСмой здСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.