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

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

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

using System;

class AnotherStaticError { // НСстатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄. void NonStaticMeth() { Console.WriteLine("Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ NonStaticMeth()."); } / Ошибка! НСпосрСдствСнный Π²Ρ‹Π·ΠΎΠ² нСстатичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ· статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° нСдопустим. / static void staticMeth() { NonStaticMeth(); // Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ компиляции! }}Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСстатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ (Ρ‚.Π΅. ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра) изстатичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС Π²ΠΎ врСмя компиляции.Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ особо ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠ° static нСльзя Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ экзСмпляра ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ экзСмпляра Π΅Π³ΠΎ класса, ΠΊΠ°ΠΊ этообычно дСлаСтся посрСдством ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса. И ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ это Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Π΅Π· указания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСмСнная ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡΠ½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½Ρ‹ΠΌΠΈ. НапримСр, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° считаСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠ²Π΅Ρ€Π½Ρ‹ΠΌ.

class MyClass { // НСстатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄. void NonStaticMeth() { Console.WriteLine("Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ NonStaticMeth()."); } / НСстатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ ΠΈΠ· статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. / public static void staticMeth(MyClass ob) { ob.NonStaticMeth(); // всС Π²Π΅Ρ€Π½ΠΎ! }}Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ NonStaticMeth() вызываСтся ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° staticMeth()ΠΏΠΎ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ob Ρ‚ΠΈΠΏΠ° MyClass.Поля Ρ‚ΠΈΠΏΠ° static Π½Π΅ зависят ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ поэтому ΠΎΠ½ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ дляхранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΠΉ ΠΊΠΎ всСму классу. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° staticслуТит для хранСния количСства ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° static для подсчСта// экзСмпляров ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².using System;

class CountInst { static int count = 0; // Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ подсчСт, ΠΊΠΎΠ³Π΄Π° создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. public CountInst() { count++; } // Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ подсчСт, ΠΊΠΎΠ³Π΄Π° уничтоТаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ~Countlnst() { count--; } public static int GetCount() { return count; }}

class CountDemo { static void Main() { CountInst ob; for(int i=0; i < 10; i++) { ob = new CountInst(); Console.WriteLine("Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: " + CountInst.GetCount()); } }}Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ.

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 1Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 2Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 3Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 4Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 5Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 6Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 7Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 8Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 9Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ подсчСт: 10Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° CountInst, инкрСмСнтируСтся ΠΏΠΎΠ»Π΅ countΡ‚ΠΈΠΏΠ° static. Но всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ утилизируСтся, ΠΏΠΎΠ»Π΅ count дСкрСмСнтируСтся. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΠ»Π΅ count всСгда содСрТит количСство ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². И это становится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ благодаря использованию поля Ρ‚ΠΈΠΏΠ° static. Аналогичный подсчСт нСльзя ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ экзСмпляра, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎ всСму классу, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ экзСмпляру ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса.НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ примСнСния статичСских Ρ‡Π»Π΅Π½ΠΎΠ² класса. Π Π°Π½Π΅Π΅ вэтой Π³Π»Π°Π²Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ класса. Π’ Ρ‚ΠΎΠΌΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° Π±Ρ‹Π»Π° нСстатичСским ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Но Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ класса Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΈΠΏΠ° static, Ρ‡Ρ‚ΠΎ Π΄Π°ΡΡ‚Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ этот Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π½Π΅ создавая Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π˜ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹,Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΉ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ класса.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ класса.using System;

class MyClass { int a, b; // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для класса MyClass. static 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() { int i, j; // Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ. for(i=0, j=10; i < 10; i++, j--) { MyClass ob = MyClass.Factory(i, j); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ob.Show(); } Console.WriteLine(); }}Π’ этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Factory() вызываСтся ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈΠ΅Π³ΠΎ класса Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΊΠΎΠ΄Π°.

MyClass ob = MyClass.Factory(i, j); // ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Ρ‚ нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса MyClass, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ этого класса.### БтатичСскиС ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ static. БтатичСский конструктор,ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², примСняСмых ковсСму классу, Π° Π½Π΅ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ экзСмпляру ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ члСныкласса ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ статичСским конструктором Π΄ΠΎ создания ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этого класса. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ примСнСния статичСскогоконструктора.

// ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ статичСский конструктор.using System;

class Cons { public static int alpha; public int beta; // БтатичСский конструктор. static Cons() { alpha = 99; Console.WriteLine("Π’ статичСском конструкторС."); } // ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ экзСмпляра. public Cons() { beta = 100; Console.WriteLine("Π’ конструкторС экзСмпляра."); }}

class ConsDemo { static void Main() { Cons ob = new Cons(); Console.WriteLine("Cons.alpha: " + Cons.alpha); Console.WriteLine("ob.beta: " + ob.beta); }}ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого ΠΊΠΎΠ΄Π° получаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π’ статичСском конструкторС.Π’ конструкторС экзСмпляра.Cons.alpha: 99ob.beta: 100ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ конструктор Ρ‚ΠΈΠΏΠ° static вызываСтся автоматичСски,ΠΊΠΎΠ³Π΄Π° класс загруТаСтся Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π΄ΠΎ конструктора экзСмпляра. Из этого ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄: статичСский конструктор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ любого конструктора экзСмпляра. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρƒ статичСских конструкторов ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ доступа β€” ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ доступом ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ,ΠΈΡ… нСльзя Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.## БтатичСскиС ΠΊΠ»Π°ΡΡΡ‹ΠšΠ»Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ static. БтатичСский класс ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ двумя основными свойствами. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ статичСского класса ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСльзя. И Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…,статичСский класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСскиС Ρ‡Π»Π΅Π½Ρ‹. БтатичСский класссоздаСтся ΠΏΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ΅ объявлСния класса, Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова static.

static class имя_класса { // ...Π’ Ρ‚Π°ΠΊΠΎΠΌ классС всС Ρ‡Π»Π΅Π½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ static. Π’Π΅Π΄ΡŒ Ссли класс становится статичСским, Ρ‚ΠΎ это совсСм Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ статичСскими становятся ΠΈ всС Π΅Π³ΠΎΡ‡Π»Π΅Π½Ρ‹.БтатичСскиС классы ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² Π΄Π²ΡƒΡ… случаях. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…,статичСский класс трСбуСтся ΠΏΡ€ΠΈ создании ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡΠ²ΡΠ·Π°Π½Ρ‹ Π² основном с языком LINQ ΠΈ поэтому ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 19.И Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, статичСский класс слуТит для хранСния совокупности связанных Π΄Ρ€ΡƒΠ³ сдругом статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ИмСнно это Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ рассматриваСтся Π½ΠΈΠΆΠ΅.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ класс NumericFn Ρ‚ΠΈΠΏΠ° static слуТит для хранСния ряда статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… числовым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Ρ‡Π»Π΅Π½Ρ‹ класса NumericFn ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ static, Ρ‚ΠΎ этот класс Ρ‚Π°ΠΊΠΆΠ΅ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ ΠΊΠ°ΠΊ static, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ экзСмпляров Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π°ΠΊΠΈΠΌΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, класс NumericFn выполняСт ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ, прСдоставляя удобныСсрСдства для группирования логичСски связанных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ статичСского класса.using System;

static class NumericFn { // Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. static public double Reciprocal(double num) { return 1/num; } // Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ числового значСния. static public double FracPart(double num) { return num - (int) num; } // Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли числовоС // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ num окаТСтся Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ. static public bool IsEven(double num) { return (num % 2) == 0 ? true : false; } // Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли числовоС // Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ num окаТСтся Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ. static public bool IsOdd(double num) { return !IsEven(num); }}

class StaticClassDemo { static void Main() { Console.WriteLine("ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° числа 5 Ρ€Π°Π²Π½Π° " + NumericFn.Reciprocal(5.0)); Console.WriteLine("Дробная Ρ‡Π°ΡΡ‚ΡŒ числа 4.234 Ρ€Π°Π²Π½Π° " + NumericFn.FracPart(4.234)); if(NumericFn.IsEven(10)) Console.WriteLine("10 β€” Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число."); if (NumericFn.IsOdd(5)) Console.WriteLine("5 β€” Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число."); // Π”Π°Π»Π΅Π΅ слСдуСт ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса NumericFn, // Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ появлСния ошибки. // NumericFn ob = new NumericFn(); // Ошибка! }}Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.