для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c

Для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c

для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π€ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c

public ref class CBookManagedCode // Managed C++ класс
<
public:
CBookManagedCode();

public:
int CalculatePrice(interior_ptr nBookID)
<
. // C++ ΠΊΠΎΠ΄
>
>;

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ C# классы Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅
Π•ΡΡ‚ΡŒ старый большой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ написанный Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ C++.
НуТно Π² этом C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ C# классы (Π² C# Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ быстрСС, Π² C# ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, Π² C# Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ классов списков ΠΈ Ρ‚.Π΄.)
Π’Π°ΠΊ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ C++ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ классы C# Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (Managed Π‘++).

НапишСм Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° C++
1) Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ C++ console application.
2) Π’ свойствах ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Common Language Runtime Support = Common Language Runtime Support (/clr)

для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π€ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c

#include «stdafx.h» // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π‘++ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ
#include // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π‘++ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ

using namespace System; // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π‘# Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для использования C# класса String
using namespace System::IO; // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π‘# Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для использования C# класса FileInfo

int _tmain( int argc, _TCHAR* argv[])
<
TCHAR strTitle[] = _T( «d://1.txt» ); // C++ ΠΊΠΎΠ΄

String^ strFilename = gcnew String(strTitle); // managed c++ ΠΊΠΎΠ΄ создаСт String (класс C#)

// ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ C# класс FileInfo
FileInfo^ finfo = gcnew FileInfo(strFilename); // managed c++ ΠΊΠΎΠ΄ создаСт FileInfo (класс C#)

// Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° экран ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ std::cout (функция C++)
std::cout «File size: » Length «\n» ;
return 0;
>

для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c. Π€ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΊΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ язык managed c

// Managed C++
String^ strFilename = gcnew String();

// C#
String strFilename = new String();

Π’ Managed C++ для обозначСния ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ^
Π’ C# ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (поэтому Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°Ρ‡ΠΊΠ°)

Π’ Managed C++ для выдСлСния памяти ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ gcnew
Π’ C# для выдСлСния памяти ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ new

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΠ±Π·ΠΎΡ€ языков программирования, прСдоставляСмых Visual Studio 2013

ЦСль Π»Π΅ΠΊΡ†ΠΈΠΈ

ОзнакомлСниС с языками C#, VB, Managed C++, JavaScript, F# ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, прСдоставляСмыми срСдой Visual Studio, ΠΈ ΠΈΡ… Π½ΠΎΠ²Ρ‹ΠΌΠΈ возмоТностями, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π² срСдС Visual Studio 2013.

7.1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅. Набор языков программирования, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π² Visual Studio 2013

7.2. Π―Π·Ρ‹ΠΊ C# ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ возмоТности Π² VS 2013.

Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΎΡ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярныС языки C++, Java ΠΈ C# (Π½Π°Π·Π²Π°Π½Π½Ρ‹Π΅ Π² порядкС ΠΈΡ… появлСния), Ρ‚ΠΎ получится ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

РазумССтся, это ΠΌΠΎΠ΅ Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ( generics ):

Π’Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Однако интСрСсно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Ссли ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ‚ΠΈΠΏ-ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° g Ρ‚ΠΈΠΏΠ° Generic Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ:

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ я пропускал Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² вСрсии Visual Studio 2010 Ultimate. Π’ Π½Π΅ΠΉ компилятор C# Π²Ρ‹Π΄Π°Π» сообщСниС ΠΎΠ± ошибкС : ΠΌΠ΅Ρ‚ΠΎΠ΄ GetType Π½Π΅ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ контСкстС. Налицо явный прогрСсс Π² Visual Studio 2013, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсиСй: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ стало Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ-ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ СстСствСнно, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠΉ программистом сСмантики Π΄Π°Π½Π½ΠΎΠΉ конструкции.

Π₯отя ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Microsoft Π½Π΅ сообщаСт ΠΎ нововвСдСниях Π² язык C# ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² вСрсии Visual Studio 2013, ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слуТит вСсомым ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° C# Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ языка ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

BestProg

Managed (управляСмыС) ΠΈ unmanaged (нСуправляСмыС) классы Π² Visual C++. ΠžΠ±Π·ΠΎΡ€ особСнностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ managed ΠΈ unmanaged классов

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Поиск Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… рСсурсах:

1. КакиС Π²ΠΈΠ΄Ρ‹ классов ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Visual C++? КакиС особСнности использования Ρ€Π°Π·Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² классов?

Π’ систСмС Visual C++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° Π²ΠΈΠ΄Π° классов:

Π Π°Π±ΠΎΡ‚Π° с указатСлями Π½Π° класс ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описываСтся Π² Ρ‚Π΅ΠΌΠ°Ρ…:

2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт массив ΠΈΠ· n чисСл

НиТС наводятся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ классов Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ²:

По Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ собствСнныС классы.

2.1. Unmanaged (нСуправляСмый) класс
2.1.1. Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса

Π’ классС ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

Π’ классС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ конструкторы:

Π’ классС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

ДСмонстрация использования класса Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅

2.1.2. Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля ( * ) Π½Π° класс
2.2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ managed (управляСмого) класса

Класс содСрТит 2 конструктора:

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

РСализация класса ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… модулях (Ρ„Π°ΠΉΠ»Π°Ρ…):

ВСкст модуля MyArray.h ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

ВСкст модуля MyArray.cpp ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

2.2.1. Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс CMyArray Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… модулях (Ρ„Π°ΠΉΠ»Π°Ρ…) Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ MyArray.h

Объясним Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°. ΠŸΡ€ΠΈ объявлСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса

Π³Π΄Π΅ число 10 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ массива.

2.2.2. Π Π°Π±ΠΎΡ‚Π° с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля ( ^ ) Π½Π° класс

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ Π² строкС

вызываСтся конструктор CMyArray() с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктор). Π’ конструкторС осущСствляСтся Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для массива ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ элСмСнтов массива значСниями.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

УправляСмый C++


Автор: Π˜Π³ΠΎΡ€ΡŒ Π’ΠΊΠ°Ρ‡Ρ‘Π²
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: RSDN Magazine #0

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ: 05.02.2002
Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ: 13.03.2005
ВСрсия тСкста: 1

Π˜Ρ‚Π°ΠΊ, β€œΠ£ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΉ C++”. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ вмСстС ΠΏΡ€ΠΎΡΡΠ½ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, насколько ΠΎΠ½ управляСм, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ этим понимаСтся ΠΈ Π² Ρ‡Ρ‘ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ появлСния.

Π‘Ρ€Π΅Π΄ΠΈ основных Π·Π°Π΄Π°Ρ‡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… срСд исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, C++ разрабатывался ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ язык, Π² Ρ‚ΠΎΠΌ числС ΠΈ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ программирования ΠΈ написания Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… устройств, Π² связи с Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π½Ρ‘ΠΌ автоматичСской сборки мусора, нСявной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ допустимости Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² являСтся Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ·-Π·Π° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π§Ρ‚ΠΎ касаСтся контроля Ρ‚ΠΈΠΏΠΎΠ², Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΎΠ± этом Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ C++ Π‘ΡŒΠ΅Ρ€Π½ Бтрауструп:

β€œΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ контроля доступа Π² C++ обСспСчиваСт Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ случайности, Π° Π½Π΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ°Π½Π°. Π›ΡŽΠ±ΠΎΠΉ язык программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ прямой доступ ΠΊ памяти, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ оставляСт любой элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ для ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ β€œΠΆΡƒΠ»ΡŒΠ½ΠΈΡ‡Π΅ΡΡ‚Π²Π°β€, Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ явныС ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ‚ΠΈΠΏΠΎΠ², сформулированныС для этого элСмСнта”

ΠŸΡ€ΡΠΌΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ API, Π° Ρ‚Π°ΠΊΠΆΠ΅ β€œΠΌΠΈΡ€Π½ΠΎΠ΅ сосущСствованиС” с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· основных ΠΏΡ€ΠΈΡ‡ΠΈΠ½ успСха C++.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°Π»ΠΈΡ†ΠΎ явныС противорСчия ΠΌΠ΅ΠΆΠ΄Ρƒ концСпциями управляСмой срСды ΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ языка программирования, ΠΊΠ°ΠΊ C++. Как ΠΆΠ΅ программистам ΠΈΠ· Π Π΅Π΄ΠΌΠΎΠ½Π΄Π° ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈ ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ CLR с β€œΠ½Π΅ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΌβ€ C++?

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, C++ остался самим собой. ΠœΡ‹ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ массивов, Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ CLR Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌ Π² этом ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, C++ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ CLR ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со своим ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‚.Π΅. ΠΈΠ³Ρ€Π°Ρ‚ΡŒ ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Ρ‚ΠΎΠΉ срСды, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Managed Extensions for C++ позволяСт C++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CLR:

УправляСмыС Ρ‚ΠΈΠΏΡ‹, массивы ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

Как Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π²Ρ‹ΡˆΠ΅, CLR ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ сборку мусора ΠΈ обСспСчиваСт Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ частями систСмы. Для обСспСчСния этих возмоТностСй срСда CLR Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ наряду с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ C++, Π½Π΅ прибСгая ΠΊ ухищрСниям Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Ρ‚ΠΈΠΏΠΎΠ² для COM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ __gc примСняСтся для объявлСния слоТных Ρ‚ΠΈΠΏΠΎΠ², массивов ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π² ΠΊΡƒΡ‡Π΅ срСды исполнСния CLR. Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ gc, скорСС всСго, происходит ΠΎΡ‚ garbage collection. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр класса Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² управляСмой ΠΊΡƒΡ‡Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ являСтся Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС компиляции:

__gc arrays

Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² управляСмых Ρ‚ΠΈΠΏΠΎΠ², ΠΏΠ°ΠΌΡΡ‚ΡŒ для управляСмых массивов выдСляСтся Π² ΠΊΡƒΡ‡Π΅ CLR. ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число элСмСнтов ΠΈ всСгда ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ создании. Для объявлСния управляСмых массивов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис:

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Foo ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Foo ΠΌΡ‹ Π½Π΅ использовали ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова __gc. Π’ этом Π½Π΅Ρ‚ нСобходимости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ компилятор ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с управляСмым Ρ‚ΠΈΠΏΠΎΠΌ.

Для возвращСния массивов ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ для объявлСния ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов Π² MC++ Ρ‚Π°ΠΊΠΆΠ΅ примСняСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²Ρ‹ΠΉ синтаксис:

Из послСднСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° явно слСдуСт, Ρ‡Ρ‚ΠΎ управляСмыС массивы Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ для нас массивами C++. Π‘ΠΊΠΎΡ€Π΅Π΅, это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со своим интСрфСйсом, ΠΈ, ΠΊ соТалСнию, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Π½ΠΈΡ… ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π² C++ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

__pin

Pin-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ сущСствуСт ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

__nogc

Как Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, это ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ нСуправляСмый Ρ‚ΠΈΠΏ C++. Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ компилятором ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ здСсь лишь для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹.

__value

Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² управляСмой ΠΊΡƒΡ‡Π΅ Ρ€Π°ΡΡ‚ΠΎΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, особСнно Ссли это просто Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΎΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π² качСствС счётчика. Как извСстно, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² стСкС являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивным для простых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ __value позволяСт ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ управляСмыС Ρ‚ΠΈΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ gc-Ρ‚ΠΈΠΏΠΎΠ², ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² управляСмой ΠΊΡƒΡ‡Π΅, Ρ‚Π°ΠΊ ΠΈ Π² стСкС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ C++ ΠΈ управляСмыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ CLR.

C++CLR
charSbyte
signed charSbyte
shortInt16
intInt32
longInt32
__int64Int64
unsigned charByte
unsigned shortUInt16
unsigned intUInt32
unsigned longUInt32
unsigned __int64UInt64
floatSingle
doubleDouble
voidVoid

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° __value ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ классы ΠΈ структуры, Ρ‚Π°ΠΊ ΠΈ управляСмыС пСрСчислимыС Ρ‚ΠΈΠΏΡ‹. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, это СдинствСнный способ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ пСрСчислСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ CLR. НапримСр:

Всё ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, послСдняя строчка Π½Π΅ содСрТит ошибки. CLR ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ пСрСчислСния, поэтому ΠΈ Π² MC++ Π²ΠΏΠΎΠ»Π½Π΅ допустимо Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ для Π½ΠΈΡ… Ρ‚ΠΈΠΏ.

__box

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово __box создаёт ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ для value-Ρ‚ΠΈΠΏΠΎΠ², послС Ρ‡Π΅Π³ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ gc-классы. Π’Π°ΠΊΠΈΠ΅ языки, ΠΊΠ°ΠΊ C# ΠΈ VB.NET, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ для value-Ρ‚ΠΈΠΏΠΎΠ² автоматичСски, Π² MC++ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΈΠ· сообраТСний ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

__gc pointers


Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹

Как извСстно, CLR Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ мноТСствСнного наслСдования классов. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½Π΅ всС языки Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚, Π°, Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉΡΡ для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ мноТСствСнном наслСдовании, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ услоТняСт структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΡ€Π°ΠΉΠ½Π΅ нСэффСктивными. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, β€œΠΎΠ±Π»Π΅Π³Ρ‡Ρ‘Π½Π½Ρ‹ΠΉ вариант” мноТСствСнного наслСдования Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ COM-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈ с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ATL Π² частности.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ наслСдования классов CLR Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ мноТСствСнноС наслСдованиС интСрфСйсов, Π½ΠΎ это наслСдованиС ΠΈ сами интСрфСйсы ΠΈΠΌΠ΅ΡŽΡ‚ ряд Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ.

ЦСль этих ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ – ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ классичСских ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ мноТСствСнном наслСдовании, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ наслСдуСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈ свСсти Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΊ простому Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌΡƒ массиву ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, рСализация ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ осущСствлСна Π² наслСдуСмых классах.

Ко всСму ΠΏΡ€ΠΎΡ‡Π΅ΠΌΡƒ MC++ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π΄Π²ΡƒΠΌ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ наслСдуСмым gc-интСрфСйсам ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСоднозначности ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, MC++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ для интСрфСйсов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (default implementations):

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ

Доступ ΠΊ управляСмым строкам ΠΊΠ°ΠΊ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ нСуправляСмым символам ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ осущСствлён ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π”Π΅Π»Π΅Π³Π°Ρ‚Ρ‹ ΠΈ события

Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΎΠ΄ΠΈΠ½ Π΄Π΅Π»Π΅Π³Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для обслуТивания Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚.Π΅. Π΄Π΅Π»Π΅Π³Π°Ρ‚ это Π½Π΅ просто ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π° список ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ – для TestDelegate2 ΠΌΡ‹ опустили ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, это допустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ являСтся статичСским. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API, Ссли ΠΎΠ½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹:

Вспоминая COM Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это всё, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° рассылки событий. Но Π½Π΅ Ρ‚Π°ΠΊ просто обстоят Π΄Π΅Π»Π° для компилятора, фактичСски ΠΎΠ½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ компилятор создаёт ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Π½Π°ΠΌ Π΄Π΅Π»Π΅Π³Π°Ρ‚ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… подпиской ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ событий. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ с Π΄Π΅Π»Π΅Π³Π°Ρ‚Π°ΠΌΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ источник событий ΠΈ ΠΈΡ… ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ:

Для подписки Π½Π° события ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ β€œ+=”, для Π΅Ρ‘ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ β€œ-=”.

Бвойства

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² CLR допустимо объявлСниС индСксируСмых свойств, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… справСдливо ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ΠœΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅

Π’ΠΏΠΎΠ»Π½Π΅ СстСствСнно, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Managed Extensions for C++ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ….

Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° MC++ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡƒΡ‚Ρ‘ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #using ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ:

Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ классов


Π’ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса


ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

Атрибуты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ срСдство Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…. Π›ΡŽΠ±ΠΎΠΉ класс ΠΈΠ»ΠΈ Π΅Π³ΠΎ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ, информация ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ сохранСна Π² ΠΌΠ΅Ρ‚Π°Π±Π°Π·Π΅. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ [DllImport]. Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ срСдС, Ρ‡Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ слСдуСт ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ user32.dll. Атрибуты ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самой CLR ΠΈΠ»ΠΈ компиляторами, доступ ΠΊ Π½ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΈΠ· любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ свои собствСнныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ (Custom Attributes).

ОбъявлСниС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° производится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ВсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ attribute ΠΈ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ класса System::Attribute ΠΈΠ»ΠΈ Π΅Π³ΠΎ наслСдников. Π—Π°Π±Π°Π²Π½ΠΎ, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? Π’ΠΎΡ‚ Π²Π°ΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² – Ρ‡Ρ‚ΠΎΠ±Ρ‹ класс стал Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ, Π½ΡƒΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ attribute. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ это просто Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, информация ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π°ΠΊ ΠΆΠ΅ сохраняСтся Π² ΠΌΠ΅Ρ‚Π°Π±Π°Π·Π΅. Когда ΠΆΠ΅ Π²Ρ‹ примСняСтС этот Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΊ вашим объявлСниям Ρ‚ΠΈΠΏΠΎΠ², Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ вмСстС с описаниСм вашСго Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСчислСния AttributeTargets позволяСт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π³Π΄Π΅ синтаксичСски ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этого пСрСчислСния выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° «Π˜Π›Π˜» Ρ‚Π°ΠΊΠΆΠ΅ допускаСтся.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

фактичСски ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ.

УправляСмыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

CLR ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΈ Π² MC++ ΠΈΡ… объявлСниС допустимо. Но, ΠΊ соТалСнию, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ сСмантику Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² нСльзя ΠΈΠ·-Π·Π° принятой Π² MC++ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с управляСмыми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‚Π°ΠΊΠΈΠ΅ языки, ΠΊΠ°ΠΊ C# ΠΈ VB.NET, Π»ΠΈΡˆΠ΅Π½Ρ‹ этого нСдостатка ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ стоит. НСльзя Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово operator для объявлСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π² управляСмых классах, для этого слСдуСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌΠΈ Π² CLR ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ соотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ ΠΈΡ… CLR ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ.

op_Decrement
op_Increment++
op_Negation!
op_UnaryNegation
op_UnaryPlus+

op_Addition+
op_Assign=
op_BitwiseAnd&
op_BitwiseOr|
op_Division/
op_Equality==
op_ExclusiveOr^
op_GreaterThan>
op_GreaterThanOrEqual>=
op_Inequality!=
op_LeftShift>
op_Subtraction

ΠžΠΏΡ†ΠΈΠΈ компилятора ΠΈ прСпроцСссор


ΠžΠΏΡ†ΠΈΡ компилятора /clr


#pragma unmanaged, #pragma managed

Π’ΠΏΠΎΠ»Π½Π΅ допустимо использованиС управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅. ΠŸΡ€Π°Π³ΠΌΠ° unmanaged заставляСт Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ компилятор нСуправляСмый, β€œΡ€ΠΎΠ΄Π½ΠΎΠΉβ€ для ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΊΠΎΠ΄. ЕстСствСнно, Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ управляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

_MANAGED

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ макрос устанавливаСтся компилятором Π² 1, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опция /clr. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π³ΠΌΠ° unmanaged Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияСт Π½Π° Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚.Π΅. ΠΎΠ±Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ 1:

ΠžΠΏΡ†ΠΈΡ компилятора /FAs


Π Π°Π·Π½ΠΎΠ΅

ΠœΡ‹ ΡƒΠΆΠ΅ достаточно ΠΌΠ½ΠΎΠ³ΠΎ выяснили ΠΎΠ± MC++, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ нСсколько ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ.

__identifier

Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Π²Π²Π΅Π΄Π΅Π½ΠΎ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΈΠΌΠ΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π² качСствС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œoperator”:

__abstract

__abstract Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ компилятору ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ наш класс ΠΈΠ»ΠΈ интСрфСйс являСтся абстрактным ΠΈ созданиС экзСмпляра этого класса Π½Π΅ допускаСтся, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс.

__sealed

Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ спСцифицируСмый класс Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.

__typeof

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ __typeof Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System::Type, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌ управляСмом Ρ‚ΠΈΠΏΠ΅.

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

УправляСмый класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ срСдой CLR Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π²Ρ‹Π·ΠΎΠ²Π° Ρ‚Π°ΠΊΠΈΡ… конструкторов Π½Π΅ гарантируСтся, Π½ΠΎ Π²Ρ‹Π·ΠΎΠ² всСгда Π±ΡƒΠ΄Π΅Ρ‚ сдСлан Π΄ΠΎ создания ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса.

Атрибут [ParamArray]

Π’ CLR допустимо объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ числом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½ΠΎ рСализация этой возмоТности отличаСтся ΠΎΡ‚ стандартного для C++ способа. На самом Π΄Π΅Π»Π΅ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² пСрСдаётся ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ управляСмым массивом ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ System::ParamArray. На MC++ это объявлСниС выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’ C# использованиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ParamArray встроСно Π² сам язык, ΠΈ вмСсто Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово params :

Π’Ρ‹Π·ΠΎΠ² нашСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° C# Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’.Π΅. фактичСски компилятор C# ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² массив ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. C++ Ρ‚Π°ΠΊΠΈΠΌΠΈ способностями Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚, ΠΈ Π½Π°ΠΌ придётся явно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ массив, явно Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ явно ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

Π‘ΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… CLR-языков MC++ позволяСт Π»Π΅Π³ΠΊΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ управляСмый ΠΈ нСуправляСмый ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ прСдставляСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ интСрСс, ΠΈ Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ²Π΅Π΄Ρ‘ΠΌ ΡΠ΅Ρ€ΠΈΡŽ смСлых экспСримСнтов для выяснСния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΈΡ… взаимодСйствия. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст:

Нас Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ различия Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π²Ρ‹Π·ΠΎΠ² управляСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· нСуправляСмого ΠΊΠΎΠ΄Π° ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ΠŸΡ€Π΅ΠΏΠ°Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ этот тСкст ΠΎΠΏΡ†ΠΈΠ΅ΠΉ компилятора /FAs ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Π½Π° Ρ‡Ρ‚ΠΎ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ – Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Ρƒ нас Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ MSIL ΠΈ ассСмблСр, ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ MC++ фактичСски содСрТит Π΄Π²Π° ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ производится Ρ‡Π΅Ρ€Π΅Π· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ понятно, СдинствСнный вопрос – это ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ происходит Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² ΠΎΠ±ΠΎΠΈΡ… случаях, с Ρ‚ΠΎΠΉ лишь Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ, Ρ‡Ρ‚ΠΎ каТдая функция Π΄Π΅Π»Π°Π΅Ρ‚ это ΠΏΠΎ-своСму. Π­Ρ‚ΠΎ лишний Ρ€Π°Π· ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ CLR Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‡Ρ‚ΠΎ Π½Π΅ совсСм ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ для управляСмой срСды.

Π‘ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ всё Π² порядкС.

ΠŸΡ€ΠΈ обсуТдСнии Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ² ΠΌΡ‹ рассмотрСли объявлСниС нСуправляСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° [DllImport], Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½Ρ‹Π΅ сомнСния Π² нСобходимости Π΅Π³ΠΎ примСнСния ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ это наглядно дСмонстрируСт:

ΠœΠ°ΠΊΡ€ΠΎΡ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ·-Π·Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΡ‘Π½, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° windows.h.

Как ΠΈ оТидалось, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° консоль строчку «123». Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это выглядит Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ обычная Win32 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ½Π° подчиняСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. НапримСр, Π²Ρ‹Π·ΠΎΠ² CoInitialize здСсь Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΈ для любого прилоТСния, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ COM-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. МоТно ΠΎΠΏΡΡ‚ΡŒ ΡƒΡΠΎΠΌΠ½ΠΈΡ‚ΡŒΡΡ Π² эффСктивности Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ управляСмым ΠΈ нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ, Π½ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°ΠΌΠΈΡ‚ΡŒ вСсь этот тСкст ΠΏΡ€Π°Π³ΠΌΠ°ΠΌΠΈ unmanaged/managed ΠΈ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° нСуправляСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±Ρ€Π°ΠΌΠ»ΡΡ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС стоит ΠΈ саму Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ #import, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² нСуправляСмой сСкции заставляСт компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для Π½Π΅Ρ‘ нСуправляСмый ΠΊΠΎΠ΄ Π²Π½Π΅ зависимости ΠΎΡ‚ мСста Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции (ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, нСуправляСмый ΠΊΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ управляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹), хотя сама функция ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² управляСмой сСкции.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ вопрос касаСтся Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ β€œΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΉβ€ ΠΈ β€œΠ½Π΅ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹ΠΉβ€ ΠΊΠΎΠ΄? Π‘ нСуправляСмым всё ясно – это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ β€œΡ€ΠΎΠ΄Π½ΠΎΠΉβ€ ΠΊΠΎΠ΄ Windows/Intel. Π‘ управляСмыми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚ΠΎΠΆΠ΅ понятно – CLR ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡ… ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. НС понятно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ C++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ управляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² MSIL ΠΊΠΎΠ΄.

ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ будут… управляСмыми, хотя ΠΌΡ‹-Ρ‚ΠΎ с Π²Π°ΠΌΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ :o)

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΈ быстро разбираСмся с C++ CLI

Π’Π°ΠΊ слоТилось, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ нСобходимости ΠΌΠ½Π΅ приходится интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ C++/CLI ΠΈ, соотвСтствСнно, довольно часто ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎ это, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ, Π·Π°Ρ‡Π΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π°Π΄ΠΎ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ появилось ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ языка, ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌΠΈ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ распространСнныС вопросы ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ мСста, Π³Π΄Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ΄Π°Ρ‡Π½ΠΎ Π»Π΅Ρ‡ΡŒ Π³Ρ€Π°Π±Π»ΠΈ.

Π§Ρ‚ΠΎ это?

К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, Π² этом синтаксисС Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈ Π½Π° управляСмый (Π² ΠΎΠ±ΠΎΠΈΡ… случаях использовалась Β«*Β»), Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова для обозначСния Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ указатСля ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅. Π­Ρ‚ΠΎ ΠΈ Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΎ Microsoft Π½Π° созданиС Π½ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π²ΠΈΠ·ΠΈΠΈ языка, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.
Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: эти Π΄Π²Π΅ вСрсии синтаксиса Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Π½ΠΈ странно, Β«old syntaxΒ» ΠΈ Β«new syntaxΒ», ΠΈ ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π² настройках компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΡ€ΠΈ создании Π½ΠΎΠ²Ρ‹Ρ… сборок Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ синтаксис, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ старый ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΈ просто ΠΏΠ»ΠΎΡ….

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ?

2) МоТно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ написанный Π½Π° ΠΏΠ»ΡŽΡΠ°Ρ… ΠΊΠΎΠ΄. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ всС возмоТности ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ C++, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ управляСмыС ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ для ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… классов Π½Π° Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠ»ΡŽΡΠ°Ρ…. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большиС возмоТности ΠΏΠΎ Π²Ρ‹Π·ΠΎΠ²Ρƒ нСуправляСмого ΠΊΠΎΠ΄Π°, Π½Π΅ΠΆΠ΅Π»ΠΈ PInvoke, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с классами Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

ВсС ΠΎΡ‡Π΅Π½ΡŒ просто. ΠŸΡ€ΠΈ компиляции ΠΊΠΎΠ΄Π° Π½Π° Π‘++/Π‘LI получаСтся сборка, содСрТащая ΠΊΠ°ΠΊ MSIL ΠΊΠΎΠ΄, Ρ‚Π°ΠΊ ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ строки, написанныС Π½Π° «чистых» ΠΏΠ»ΡŽΡΠ°Ρ…. «Но ΠΊΠ°ΠΊ ΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ с ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½ΠΎΡΡ‚ΡŒΡŽ?Β» β€” спроситС Π²Ρ‹, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€Π°Π²Ρ‹. Никак. Π’ частности, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ получится ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ для 32 ΠΈ 64 Π±ΠΈΡ‚Π½Ρ‹Ρ… вСрсий (ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС ΠΏΠΎΠ΄ Β«Any CPUΒ»). Π’Π°ΠΊΠΎΠ²Π° расплата Π·Π° использованиС всСх возмоТностСй Π‘++. ЕстСствСнно, это относится ΠΊ Ρ‚ΠΎΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ микс ΠΈΠ· управляСмого ΠΈ нСуправляСмого ΠΊΠΎΠ΄Π°. ВсСго Π΅ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² компиляции:
β€’ /clr β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° управляСмого ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° с использованиСм Π½ΠΎΠ²ΠΎΠ³ΠΎ синтаксиса.
β€’ /сlr:pure β€” Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ поддСрТиваСтся. Однако ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСбСзопасный ) ΠΊΠΎΠ΄, Π² Ρ‚ΠΎΠΉ ΠΌΠ΅Ρ€Π΅, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Π‘#-сборках ΠΏΡ€ΠΈ использовании Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ unsafe.
β€’ /clr:safe β€” Волько управляСмый бСзопасный ΠΊΠΎΠ΄. Аналог β€” компиляция C#-сборки Π±Π΅Π· использования unsafe.
β€’ /clr:oldSyntax β€” Π°Π½Π°Π»ΠΎΠ³ /clr, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ старый синтаксис.

Как выглядит?

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ сравнСния основных конструкций для Π‘# ΠΈ C++/CLI.

ОбъявлСниС класса

public sealed class Class1 : Class2

public ref class Class1 sealed : Class2

ОбъявлСниС структуры

public struct Class1 : IEquatable

public value class Class1 : IEquatable

ОбъявлСниС интСрфСйса

public interface ISomeInterface

public interface class ISomeInterface

ОбъявлСниС пСрСчислСния
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ управляСмого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Π’ C++/CLI для обозначСния ссылок Π½Π° управляСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Β«^Β» вмСсто Β«*Β». Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΌ Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π½Π°Π΄ΠΎ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ создании локального ссылочного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмантику стСка:
Object obj();
Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈ использовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… IDisposable (Ρ€Π΅Ρ‡ΡŒ ΠΎΠ± этом ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠΎΠ·ΠΆΠ΅) Π»ΠΈΠ±ΠΎ для value-Ρ‚ΠΈΠΏΠΎΠ². Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ»Π°Π½Π΅ хранСния ΠΈ использования value-Ρ‚ΠΈΠΏΠΎΠ² Π‘++/CLI Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ свободу, Ρ‡Π΅ΠΌ C#, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ программист ΠΌΠΎΠΆΠ΅Ρ‚ сам Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылку ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуация ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° количСствС boxing/unboxing ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ управляСмого массива

НСуправляСмыС массивы ΠΏΡ€ΠΈ этом ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΠΌΠ΅Ρ‚ΠΎΠ΄

void Method( int byValue, ref int byRef, out int outValue);

void Method( int byValue, int %byRef, [ out ] int %outValue);

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
РСализация шаблона IDisposable

protected virtual void Dispose( bool disposing)
<
if (disposing)
<
//release managed resources
>

//release unmanaged resources
>

Class1()
<
//release managed resources

//Аналог Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
!Class1()
<
//release unmanaged resources
>
>

Π§Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π·Π° ΠΊΠ°Π΄Ρ€ΠΎΠΌ?

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½Ρƒ ΡΡ‚Π°Ρ‚ΡŒΡŽ всС ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ. НС рассмотрСнными ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Ρ‚Π°ΠΊΠΈΠ΅ вопросы ΠΊΠ°ΠΊ:
β€’ Бинтаксис Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠ², свойств, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, foreach ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅
β€’ Π–ΠΎΠ½Π³Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· управляСмого Π² нСуправляСмый ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, массивами ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ
β€’ Π§Ρ‚ΠΎ поддСрТиваСтся ΠΈ Π½Π΅Ρ‚ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² Π‘# ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ C++
β€’ ΠžΡΠΎΠ±Π΅Π½ΠΎΡΡ‚ΠΈ компиляции ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ со сборками Π‘++/CLI
β€’ Вопросы ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Когда ΠΈ Π² Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ? Π“Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ?

Π§Ρ‚ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ?

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *