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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПолноС руководство. Π‘# 4.0Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 129

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

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° Π’ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ°, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΡ‚ класса MyClass, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌ интСрфСйс IMyInterface ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Если ΠΆΠ΅ Π² ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎ ограничСнияна ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° where, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² where.using System;// Π£ класса Gen ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°, ΠΈ Π½Π° ΠΎΠ±Π° Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ// ограничСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² where.class Gen<T, V> where T : classwhere V : struct { T ob1; V ob2; public Gen(T t, V v) { ob1 = t; ob2 = v; }}class MultipleConstraintDemo { static void Main() { // Π­Ρ‚Π° строка ΠΊΠΎΠ΄Π° Π²ΠΏΠΎΠ»Π½Π΅ допустима, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ // string β€” это ссылочный Ρ‚ΠΈΠΏ, a int β€” Ρ‚ΠΈΠΏ значСния. Gen<string, int> obj = new Gen<string, int>("тСст", 11); // А ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΊΠΎΠ΄Π° нСдопустима, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ // bool Π½Π΅ относится ΠΊ ссылочному Ρ‚ΠΈΠΏΡƒ. // Gen<bool, int> obj = new Gencbool, int>(true, 11); }}

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ класс Gen ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с ограничСниями, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² where. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ наобъявлСниС этого класса.class Gen<T, V> where T : class where V : struct {

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ where отдСляСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ. Π”Ρ€ΡƒΠ³ΠΈΠ΅Π·Π½Π°ΠΊΠΈ прСпинания ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΈ Π΄Π°ΠΆΠ΅ нСдопустимы.ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ значСния, присваиваСмого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, ΠΏΡ€ΠΈ написании ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½ΠΎ провСстиразличиС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Вакая ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Π² частности, Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Для ссылочных Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтсяnull, для нСструктурных Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” 0 ΠΈΠ»ΠΈ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ссли этотип bool, Π° для структур Ρ‚ΠΈΠΏΠ° struct β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структуры с полями,установлСнными ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ этой связи Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΠ΅Ρ‚ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ°: null, 0 ΠΈΠ»ΠΈ Π½Π΅Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅?НапримСр, Ссли Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ объявлСнии класса Test:class Test<T> { Π’ obj; // ...

ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj трСбуСтся ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²obj = null; // ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ссылочных Ρ‚ΠΈΠΏΠΎΠ²

ΠΈΠ»ΠΈobj = 0; // ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для числовых Ρ‚ΠΈΠΏΠΎΠ² ΠΈ // пСрСчислСний, Π½ΠΎ Π½Π΅ для структур

слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ? Для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π΄ΠΈΠ»Π΅ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉΡ„ΠΎΡ€ΠΌΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° default, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅.default(Ρ‚ΠΈΠΏ)

Π­Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° default ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Π° для всСх Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ°, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ссылочныС Ρ‚ΠΈΠΏΡ‹.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°default.// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° default.using System;class MyClass { // ...}// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, присваиваСмоС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° Π’ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.class Test<T> { public Π’ obj; public Test() { // Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ годится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ссылочных Ρ‚ΠΈΠΏΠΎΠ². // obj = null; // Π½Π΅ годится // Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ годится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. // obj = 0; // Π½Π΅ годится // А этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ годится ΠΊΠ°ΠΊ для ссылочных Ρ‚ΠΈΠΏΠΎΠ², // Ρ‚Π°ΠΊ ΠΈ для Ρ‚ΠΈΠΏΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. obj = default(T); // Годится! } // ...}class DefaultDemo { static void Main() { // Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Test, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ссылочный Ρ‚ΠΈΠΏ. Test<MyClass> Ρ… = new Test<MyClass>(); if(x.obj == null) Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ x.obj ΠΈΠΌΠ΅Π΅Ρ‚ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ <null>."); // Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Test, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΈΠΏ значСния. Test<int> Ρƒ = new Test<int>(); if(Ρƒ.obj == 0) Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρƒ.obj ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0."); }}

Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΊΠΎΠ΄Π°.ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ x.obj ΠΈΠΌΠ΅Π΅Ρ‚ пустоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ <null>.ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρƒ.obj ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ структуры

Π’ C# Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ структуры. Бинтаксис для Π½ΠΈΡ… Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅,ΠΊΠ°ΠΊ ΠΈ для ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… классов. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создаСтся обобщСнная структура XY для хранСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ X, Y.// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ структуры.using System;// Π­Ρ‚Π° структура являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ.struct XY<T> { Π’ Ρ…; Π’ Ρƒ; public XY(Π’ Π°, Π’ b) { Ρ… = Π°; Π£ = b; } public Π’ X { get { return Ρ…; } set { Ρ… = value; } } public T Y { get { return y; } set { Ρƒ = value; } }}class StructTest { static void Main() { XY<int> xy = new XY<int>(10, 20); XY<double> xy2 = new XY<double>(88.0, 99.0); Console.WriteLine(xy.X + ", " + xy.Y); Console.WriteLine(xy2.X + ", " + xy2.Y); }}

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.10, 2088, 99

Как ΠΈ Π½Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ классы, Π½Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ структуры ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ ограничСния. НапримСр, Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ структуры XYнакладываСтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° значСния.struct XY<T> where Π’ : struct {// ...Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹Ρ… Π² ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… классах, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ,Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ автоматичСски становятся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΡƒΡ‚ΠΈΠΏΠ°. Но ΠΏΠΎΠΌΠΈΠΌΠΎ этого имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ со своимисобствСнными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° ΠΈ Π΄Π°ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π²Π½Π΅ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΌ классС.

Рассмотрим для Π½Π°Ρ‡Π°Π»Π° простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π½Π΅ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ класс ArrayUtils, Π° Π² Π½Π΅ΠΌ β€” статичСский ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄CopyInsert(). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ содСрТимоС ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, вводя ΠΏΠΎΡ…ΠΎΠ΄Ρƒ Π΄Π΅Π»Π° Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ мСстС. ΠœΠ΅Ρ‚ΠΎΠ΄ CopyInsert() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с массивами любого Ρ‚ΠΈΠΏΠ°.// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.using System;// Класс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ массивов. Π­Ρ‚ΠΎΡ‚ класс Π½Π΅ являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌ.class ArrayUtils { // ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив, вводя ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ Π΄Π΅Π»Π° Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт. // Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ являСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌ. public static bool CopyInsert<T> (Π’ e, uint idx, T[] src, T[] target) { // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, насколько Π²Π΅Π»ΠΈΠΊ массив. if(target.Length < src.Length+1) return false; // Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ содСрТимоС массива src Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ массив, // ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ ввСдя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΅ ΠΏΠΎ индСксу idx. for(int i=0, j=0; i < src.Length; i++, j++) { if(i == idx) { target[j] = e; j++; } target[j] = src[i]; } return true; }}class GenMethDemo { static void Main() { int[] nums = { 1, 2, 3 }; int[] nums2 = new int[4]; // ВывСсти содСрТимоС массива nums. Console.Write("Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива nums: "); foreach(int x in nums) Console.Write(Ρ… + " "); Console.WriteLine(); // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ массив Ρ‚ΠΈΠΏΠ° int. ArrayUtils.Copylnsert(99, 2, nums, nums2); // ВывСсти содСрТимоС массива nums2. Console.Write("Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива nums2: "); foreach(int x in nums2) Console.Write(x + " "); Console.WriteLine(); //А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ массив строк, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ copyInsert. string[] strs = {"ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ", "вСсьма", "эффСктивны."}; string[] strs2 = new string[4]; // ВывСсти содСрТимоС массива strs. Console.Write("Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива strs: "); foreach(string s in strs) Console.Write(s + " "); Console.WriteLine(); // ВвСсти элСмСнт Π² массив строк. ArrayUtils.Copylnsert("Π² Π‘#", 1, strs, strs2); // ВывСсти содСрТимоС массива strs2. Console.Write("Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива strs2: "); foreach(string s in strs2) Console.Write(s + " "); Console.WriteLine(); // Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² нСдопустим, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ // относится ΠΊ Ρ‚ΠΈΠΏΡƒ double, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ // Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ элСмСнты массивов Ρ‚ΠΈΠΏΠ° int. // ArrayUtils.Copylnsert(0.01, 2, nums, nums2); }}

Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива nums: 1 2 3Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива nums2: 1 2 99 3Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива strs: ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ вСсьма эффСктивны.Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ массива strs2: ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΡ Π² C# вСсьма эффСктивны.

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ CopyInsert(). ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° объявлСниС этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΊΠΎΠ΄Π°.public static bool CopyInsert<T>(Π’ e, uint idx, T[] src, T[] target) {