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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 125

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

β–‘ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ наслСдованиС, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΈΠ· System.ValueType. НСвозмоТно Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ структуры ΠΈ структура Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ структуры ΠΈΠ»ΠΈ класса.

β–‘ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠšΠ»Π°ΡΡΡ‹ всСгда ΡΠ²Π»ΡΡŽΡ‚ΡΡ ссылочными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

β–‘ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ способ размСщСния ΠΏΠΎΠ»Π΅ΠΉ Π² памяти ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ эквивалСнт объСдинСний C++.

β–‘ ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ структуры ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²; всСгда поставляСтся компилятором ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ классы ΠΈ структуры сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² C#, ΠΎΠ½ΠΈ Π² этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠšΠ»Π°ΡΡΡ‹ 

ΠšΠ»Π°ΡΡΡ‹ Π² C# ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π² основном Ρ‚Π΅ΠΌ ΠΆΠ΅ самым ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ Π² C++, ΠΎΠ΄Π½Π°ΠΊΠΎ сущСствуСт Ρ€Π°Π·Π½ΠΈΡ†Π° Π² свойствах ΠΈ синтаксисС. ΠœΡ‹ рассмотрим отличия ΠΌΠ΅ΠΆΠ΄Ρƒ классами C++ ΠΈ классами C# Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса

ΠšΠ»Π°ΡΡΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² C# с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд выглядит ΠΊΠ°ΠΊ синтаксис C++:

class MyClass : MyBaseClass {

 private string SomeField;

  public int SomeMethod() {

   return 2;

 }

}

Π—Π° этим ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ сходством ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ многочислСнныС различия Π² дСталях.

β–‘ ΠΠ΅ сущСствуСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° доступа ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. НаслСдованиС всСгда ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅.

β–‘ ΠšΠ»Π°ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (хотя ΠΈΠ· любого числа интСрфСйсов). Если Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс явно Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Ρ‚ΠΎ класс Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈΠ· System.Object, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставит Π΅ΠΌΡƒ всю Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ System.Object, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ToString().

β–‘ ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π»Π΅Π½ явно ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ доступа. НС сущСствуСт эквивалСнта синтаксису C++, Π³Π΄Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ нСскольким Ρ‡Π»Π΅Π½Π°ΠΌ.

public: // нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот синтаксис Π² C#

 int MyMethod();

 int MyOtherMethod();

β–‘ ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ inline. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ C# компилируСтся Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык (IL). Π›ΡŽΠ±Ρ‹Π΅ вставки ΠΊΠΎΠ΄Π° происходят Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ стадии компиляции, ΠΊΠΎΠ³Π΄Π° JIT-компилятор выполняСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· IL Π² собствСнный ΠΊΠΎΠ΄ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. JIT-компилятор ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊΠΎ всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² IL ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ для вставки Π±Π΅Π· нСобходимости ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ Π² исходном ΠΊΠΎΠ΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

β–‘ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² всСгда помСщаСтся вмСстС с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. НСвозмоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Π½Π΅ класса, ΠΊΠ°ΠΊ позволяСт C++.

β–‘ Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² ANSI C++ СдинствСнными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Ρ‡Π»Π΅Π½Π° класса ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, конструкторы, дСструкторы ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Π΅ вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², C# ΠΈΠΌΠ΅Π΅Ρ‚ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ², события ΠΈ свойства.

β–‘ ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ доступа public, private ΠΈ protected ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΈ Π² C++, Π½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° доступа:

 β–‘ internal ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ доступ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ сборки.

 β–‘ protected internal ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ доступ ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ классам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ сборки.

β–‘ Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² C# Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса.

β–‘ Π’ C++ ставится Ρ‚ΠΎΡ‡ΠΊΠ° с запятой послС Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉΡΡ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобки Π² ΠΊΠΎΠ½Ρ†Π΅ опрСдСлСния класса. Π­Ρ‚ΠΎ Π½Π΅ трСбуСтся Π² C#.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Ρ‡Π»Π΅Π½ΠΎΠ²

Бинтаксис, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ Ρ‡Π»Π΅Π½ΠΎΠ² Π² C#, ΠΎΡ‡Π΅Π½ΡŒ отличаСтся ΠΎΡ‚ синтаксиса C++, хотя ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ.

Π§Π»Π΅Π½Ρ‹ экзСмпляра

Π’ C++ поля Ρ‡Π»Π΅Π½ΠΎΠ² экзСмпляра ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора:

MyClass::MyClass() : m_MyField(6) {

 // ΠΈ Ρ‚.Π΄.

Π’ C# этот синтаксис нСдопустим. МоТно ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ конструктора (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся эквивалСнтом C# списка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора Π² C++) Π΄Ρ€ΡƒΠ³ΠΎΠΉ конструктор. ВмСсто этого ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ помСчаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ опрСдСлСния Ρ‡Π»Π΅Π½Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса:

class MyClass {

 private int MyField = 6;

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² C++ это Π±ΡƒΠ΄Π΅Ρ‚ ошибкой, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ C++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ синтаксис для опрСдСлСния чисто Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ C# Ρ‚Π°ΠΊΠΎΠ΅ дСйствиС считаСтся Π½ΠΎΡ€ΠΌΠΎΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ C# Π½Π΅ примСняСт синтаксис =0 для этой Ρ†Π΅Π»ΠΈ (ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ вмСсто этого ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово abstract).

БтатичСскиС поля

Π’ C++ статичСскиС поля ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ опрСдСлСния Π²Π½Π΅ класса:

int MyClass:MyStaticField = 6;

На самом Π΄Π΅Π»Π΅ Π² C++, Π΄Π°ΠΆΠ΅ Ссли Π½Π΅ трСбуСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСскоС ΠΏΠΎΠ»Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эту ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ этому C# Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ инструкции, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² C# ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС:

Class MyClass {

 private static int MyStaticField = 6;

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹

Бинтаксис объявлСния конструкторов Π² C# Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ синтаксис для встраиваСмых конструкторов, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса Π² C++.

class MyClass {

 publiс MyClass() {

  // ΠΊΠΎΠ΄ конструктора

 }

Как ΠΈ Π² C++, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ конструкторов, сколько потрСбуСтся, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ число ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². (ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ…, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… вСрсий.)

Для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ конструкторы Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π² C# ΠΏΠΎ сути Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ Π² C++. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктор Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ (это всСгда System.Object) выполняСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π·Π° Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ конструкторы Π² порядкС, опрСдСляСмом Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ.

БтатичСскиС конструкторы

C# допускаСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ статичСского конструктора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ прямого эквивалСнта Π² C++.

class MyClass {

 static MyClass() {

  // ΠΊΠΎΠ΄ статичСского конструкторС

 }

БтатичСскиС конструкторы ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС поля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ значСниями ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…). Π’Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π² C++, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выглядит бСспорядочным. НаиболСС ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая обращаСтся ΠΊ статичСским ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ, ΠΈ функция Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π·Π°Π΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ статичСский конструктор Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ спСцификатора доступа, ΠΎΠ½ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ, Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΅Ρ‰Π΅. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ смысла, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ статичСский конструктор вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ срСдой выполнСния .NET, ΠΊΠΎΠ³Π΄Π° загруТаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса. Он Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ C#.

C# Π½Π΅ Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ статичСский конструктор, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСх статичСских ΠΏΠΎΠ»Π΅ΠΉ, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, ΠΈΠ»ΠΈ Ρ‚Π°ΠΌ, Π³Π΄Π΅ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

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

Как ΠΈ Π² C++ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· создания экзСмпляров класса, объявляя Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор СдинствСнным.

class MyClass {

 private MyClass() {

 }

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры Π»ΡŽΠ±Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов. Однако, Ссли класс ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Π½Π΅ΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ абстрактными, Ρ‚ΠΎ нСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр этого класса, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса.

Бписки ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ C# ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ элСмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выглядят ΠΊΠ°ΠΊ списки ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора C++. Однако Π² C# Ρ‚Π°ΠΊΠΎΠΉ список содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ максимум ΠΎΠ΄ΠΈΠ½ Ρ‡Π»Π΅Π½ ΠΈ называСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ конструктора. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ конструктором нСпосрСдствСнного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ конструктором Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса. Бинтаксис этих Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова base ΠΈ this соотвСтствСнно: