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

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

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

Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ MinVal(), Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² массивС nums. Π”Π»ΠΈΠ½Π° этого массива Ρ€Π°Π²Π½Π° числу ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MinVal() ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ наимСньшСС срСди любого числа Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° послСдний Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MinVal(). ВмСсто ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС пСрСдаСтся массив, содСрТащий ряд Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. И такая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π°Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ допустима. Когда создаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° params, ΠΎΠ½ воспринимаСт список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ ΠΈΠ»ΠΈ ΠΆΠ΅ массив, содСрТащий Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ‚ΠΈΠΏΠ° params ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ любоС числоаргумСнтов, всС ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ массива, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ этим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ.

НапримСр, Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MinVal()min = ob.MinVal(l, 2.2); // НСвСрно!

считаСтся нСдопустимым, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ double(Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2.2) Π² Ρ‚ΠΈΠΏ int, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ для массива nums Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ MinVal().ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ params слСдуСт остороТно, соблюдая граничныСусловия, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° params ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ любоС число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² β€”Π΄Π°ΠΆΠ΅ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅! НапримСр, Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MinVal() Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ кодасчитаСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния синтаксиса Π‘#.min = ob.MinVal(); // Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²min = ob.MinVal(3); // 1 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚

ИмСнно поэтому Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ MinVal() ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² массивС nums хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этомуэлСмСнту. Если Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ, Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MinVal() Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ситуация Π²ΠΎ врСмя выполнСния. (ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ±ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуациях Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π² Π³Π»Π°Π²Π΅ 13.) Π‘ΠΎΠ»ΡŒΡˆΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MinVal()написан Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. Π’ этомслучаС возвращаСтся этот СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

Π£ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‚Π°ΠΊ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ShowArgs()ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° string, Π° Ρ‚Π°ΠΊΠΆΠ΅ цСлочислСнный массив Π² качСствСпарамСтра Ρ‚ΠΈΠΏΠ° params.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ вмСстС с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Ρ‚ΠΈΠΏΠ° params.using System;class MyClass { public void ShowArgs(string msg, params int[] nums) { Console.Write(msg + "); foreach(int i in nums) Console.Write(i + " "); Console.WriteLine(); }}class ParamsDemo2 { static void Main() { MyClass ob = new MyClass(); ob.ShowArgs("Π­Ρ‚ΠΎ ряд Ρ†Π΅Π»Ρ‹Ρ… чисСл", 1, 2, 3, 4, 5); ob.ShowArgs("А это Π΅Ρ‰Π΅ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа ", 17, 20); }}

Π’ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.Π­Ρ‚ΠΎ ряд Ρ†Π΅Π»Ρ‹Ρ… чисСл: 1, 2, 3, 4, 5А это Π΅Ρ‰Π΅ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа: 17, 20

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

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ любого Ρ‚ΠΈΠΏΠ°, Π² Ρ‚ΠΎΠΌ числС ΠΈ Ρ‚ΠΈΠΏ класса. НиТС Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ класса Rect, содСрТащий ΠΌΠ΅Ρ‚ΠΎΠ΄ Enlarge(), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ строится ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ сторонами, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π½ΠΎ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ коэффициСнт.// Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.using System;class Rect { int width; int height; public Rect(int w, int h) { width = w; height = h; } public int Area() { return width * height; } public void Show() { Console.WriteLine(width + " " + height); } /* ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ со сторонами, ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ коэффициСнт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. */ public Rect Enlarge(int factor) { return new Rect(width * factor, height * factor); }}class RetObj { static void Main() { Rect r1 = new Rect(4, 5); Console.Write("Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r1: "); r1.Show(); Console.WriteLine("ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r1: " + rl.Area(1); Console.WriteLine(); // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² Π΄Π²Π° Ρ€Π°Π·Π° больший ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° rl. Rect r2 = r1.Enlarge(2); Console.Write("Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r2: "); r2.Show(); Console.WriteLine("ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r2: " + r2.АгСа()); }}

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r1: 4 5ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r1: 20Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r2: 8 10ΠŸΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° r2: 80

Когда ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, послСдний ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€,ΠΏΠΎΠΊΠ° Π½Π΅ останСтся ссылок Π½Π° Π½Π΅Π³ΠΎ. ПослС этого ΠΎΠ½ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ сборкС ΠΊΠ°ΠΊ "мусор". Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ уничтоТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ создавший Π΅Π³ΠΎΠΌΠ΅Ρ‚ΠΎΠ΄.

Одним ΠΈΠ· практичСских ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² примСнСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² слуТит Ρ„Π°Π±Ρ€ΠΈΠΊΠ° класса, которая прСдставляСт собой ΠΌΠ΅Ρ‚ΠΎΠ΄, прСдназначСнныйдля построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΅Π³ΠΎ ΠΆΠ΅ класса. Π’ рядС случаСв ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΊΠ»Π°ΡΡΠ° доступ ΠΊ Π΅Π³ΠΎ конструктору Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ· сообраТСний бСзопасности ΠΈΠ»ΠΈ ΠΆΠ΅ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ построСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° зависит ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π’ подобныхслучаях для построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° класса. ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ простому ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ класса.using System;class MyClass { int a, b; // Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ класса // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для класса MyClass. public MyClass Factory(int i, int j) { MyClass t = new MyClass(); t.a = i; t.b = j; return t; // Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ } public void Show() { Console.WriteLine("Π° ΠΈ b: " + a + " " + b); }}class MakeObjects { static void Main() { MyClass ob = new MyClass(); int i, j; // Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ класса. for(i=0, j=10; i < 10; i++, j--){ MyClass anotherOb = ob.Factory(i, j); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ anotherOb.Show(); } Console.WriteLine(); }}

Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого ΠΊΠΎΠ΄Π°.Π° ΠΈ b: 0 10Π° ΠΈ b: 1 9Π° ΠΈ b: 2 8Π° ΠΈ b: 3 7Π° ΠΈ b: 4 6Π° ΠΈ b: 5 5Π° ΠΈ b: 6 4Π° ΠΈ b: 73Π° ΠΈ b: 8 2Π° ΠΈ b: 91

Рассмотрим Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ конструктор длякласса MyClass Π½Π΅ опрСдСляСтся, ΠΈ поэтому доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ конструктор, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π° ΠΈ b нСльзя Π·Π°Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора. Но Π² Ρ„Π°Π±Ρ€ΠΈΠΊΠ΅ класса Factory() ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°ΡŽΡ‚ΡΡ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π° ΠΈ b. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π° ΠΈ b ΡΠ²Π»ΡΡŽΡ‚ΡΡΠ·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ, ΠΈ поэтому ΠΈΡ… значСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ фабрикикласса Factory().

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main() получаСтся экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса MyClass, Π° Π΅Π³ΠΎ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅ for для создания дСсяти Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° строка ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.MyClass anotherOb = ob.Factory(i, j); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° создаСтся пСрСмСнная ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚anotherOb, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присваиваСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ класса. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шага ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° пСрСмСнная anotherOb Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π°ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ области своСго дСйствия, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½Π° ссылаСтся, утилизируСтся.Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ массива ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Π’ C# массивы Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ массив. (Π’ этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ C# отличаСтся ΠΎΡ‚ C++, Π³Π΄Π΅ Π½Π΅ допускаСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ массивов ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².) Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉΠΌΠ΅Ρ‚ΠΎΠ΄ FindFactors() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив, содСрТащий ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒΠ°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.// Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ массив ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.using System;class Factor { /* ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив facts, содСрТащий ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° num. ΠŸΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ numfactors Ρ‚ΠΈΠΏΠ° out Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ количСство ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ. */ public int[] FindFactors(int num, out int numfactors) { int[] facts = new int[80]; // Ρ€Π°Π·ΠΌΠ΅Ρ€ массива 80 Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ int i, j; // Найти ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π² массив facts. for(i=2, j=0; i < num/2 + 1; i++) if( (num%i)==0 ) { facts[j] = i; j++; } numfactors = j; return facts; }}class FindFactors { static void Main() { Factor f = new Factor(); int numfastors; int[] factors; factors = f.FindFactors(1000, out numfactors); Console.WriteLine("ΠœΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΠΈ числа 1000: "); for(int i=0; i < numfactors; i++) Console.Write(factors[i] + " "); Console.WriteLine(); }}