C ++/CLI – Wikipedia Wikipedia

before-content-x4

C ++/CLI (C ++ zmodyfikowane dla wspólnej infrastruktury językowej) to specyficzny język programowania stworzony przez Microsoft i zamierzony do zastąpienia zarządzanych rozszerzeń dla C ++. Jest to kompletna wersja, której celem jest uproszczenie starej składni zarządzanej C ++, teraz przestarzały. [Pierwszy] C ++/CLI zostało znormalizowane przez ECMA jako ECMA-372 . Jest dostępny w Visual Studio 2005, 2008, 2010, 2012, 2013, 2015 i 2017, w tym wersjach ekspresowych.

after-content-x4

C ++/CLI jest wymyślony jako język sam w sobie (na przykład z nowym zestawem słów kluczowych), w przeciwieństwie do zarządzanego C ++ (MC ++), co jest raczej a nadzbiór C ++, w których zidentyfikowano niestandardowe słowa kluczowe __GC O __wartość . W związku z tym wprowadza kilka ważnych zmian składniowych, głównie związanych z eliminacją niejednoznacznych identyfikatorów i dodaniem określonych funkcji NET.

Wiele składni w konflikcie, takich jak wiele wersji operatora nowy() W MC ++ zostały oddzielone: ​​w C ++/CLI i IN. Net Rodzaje odniesienia są tworzone z nowym słowem kluczowym Gcnew (co jest dla śmieci zebrane nowe () ). Ponadto C ++/CLI wprowadził pojęcie generyczne z. Net (podobne, dla najczęstszych celów, do standardowych szablonów C ++, ale bardzo różni się w ich implementacji).

Uchwyty [[[ zmiana |. Modifica Wikitesto ]

W MC ++ istniały dwa różne typy odcinków: wskaźniki __nogc , zasadniczo zwykłe odcinki C ++ i wskaźniki __GC , używane do rodzajów odniesienia. Internet. Jednak w C ++/CLI jedynym typem wskaźnika jest normalny wskaźnik C ++, podczas gdy rodzaje odniesienia. Net są dostępne przez uchwyt Za pomocą nowej składni Klassname^ zamiast Nazwa klasy* . Ta nowa konstrukcja jest szczególnie przydatna, gdy kod zawiera razem standardowy kod C ++ i kod zarządzany; Pozwala wyjaśnić, jakie obiekty zarządzały zbieranie śmieci Automatyczny. Netto i jakie są obiekty, które programista musi wyraźnie zniszczyć.

Ślad referencji [[[ zmiana |. Modifica Wikitesto ]

I ślad referencji (zwane także odniesieniami do śledzenia) W C ++/CLI jest uchwytem przeszłej zmiennej w celach informacyjnych. Jako koncepcja jest podobna do użycia *& (Odniesienie do wskaźnika) w klasycznym C ++ i (w funkcjach funkcji) odpowiada słowowi kluczowe Ref zastosowane do typów w C#, lub Byref W. Internet. Aby wskazać przyczepność odniesienia, C ++/CLI używa jako składni ^% .

Przykład używania ślad referencji Jest pokazany w następującym kodzie. Zastąpienie śledzenia odniesień regularnym uchwytem pozostawiłoby tablicę ciągów, które powstały w wyniku 10 nieinitalnych strun, ponieważ tylko sznurki uchwytu byłyby ustawione w tablicy, ponieważ są one przekazywane przez wartość, a nie do odniesienia.

int  główny ()  {   szyk < Strunowy ^>  ^ arr  =  Gcnew  szyk < Strunowy ^> ( dziesięć );   int  I  =  0 ;   Do  każdy ( Strunowy ^%  S  W  arr )  {   S  =  I ++ . Toostring ();   }      return 0;
}

Zauważ, że w C# ten konstrukt nie byłby dozwolony, biorąc pod uwagę, że nie zezwala on na przejście wartości do odniesienia przez cykle dla każdego . Dlatego konieczne byłoby rozwiązanie wtórne lub tymczasowe.

after-content-x4

Finizery i zmienne automatyczne [[[ zmiana |. Modifica Wikitesto ]

Kolejną różnicą z C ++/CLI jest syntaktyczne wprowadzenie finalizatorów !Nazwa klasy , Specjalny rodzaj nieokreślonego niszczyciela wykonanego w ramach rutyny zbierania śmieci. Składnia klasycznych niszczy C ++, które ~ ClassName () , istnieje również dla obiektów zarządzanych i lepiej odzwierciedla „tradycyjną” semantykę C ++ deterministycznego zniszczenia (w rzeczywistości niszczyciele można powołać na poziomie kodu za pomocą za pomocą usuwać .

W naturalnym paradygmacie .NET nieokerministyczny model zniszczenia anuluje chronioną metodę Sfinalizować klasowy Obiekt ; podczas gdy model deterministyczny jest zaimplementowany metodą Dysponować interfejs IdisposBoBal (że kompilator C ++/CLI przekształca się w niszczyciel). Obiekty z C# lub VB.NET, które anulują metodę dipose, można umieścić ręcznie w C ++/CLI za pomocą usuwać , podobnie jak zajęcia. Net w C ++/CLI.

// C ++/CLI  Ref  klasa  Moja klasa {  publiczny :   Moja klasa ();  // producent   ~ Moja klasa ();  // niszczyciel (deterministyczny) (zaimplementowany jako idistable.sseposed ())  chroniony :   ! Moja klasa ();  // finalizer (niszczyciel nie terministyczny) (zaimplementowany jako finalize ())  publiczny :   statyczny  próżnia  Test () {   Moja klasa  automatyczny ;  // nie jest uchwytem i nie zainicjowany: kompilator wywołuje tutaj producent   Moja klasa  ^ użytkownik  =  Gcnew  Moja klasa ();   usuwać  użytkownik ;          // Il compilatore invoca il distruttore automatico quando l'automatico esce dalla visibilità (scope)     }
};

Operator przeciążenia [[[ zmiana |. Modifica Wikitesto ]

Operator przeciążenia (lub przeciążenia) działa dokładnie tak, jak w klasycznym C ++. Każdy * staje się jednym ^, każdy i staje się%, a reszta składni jest całkowicie niezmieniona, z wyjątkiem: dla klas. Net, operator przeciążenia jest niestabilny i nie dożywa nie tylko dla samych klas, ale także dla odniesień do klas. Ta szczególność jest konieczna, aby dać Klasa ref semantyka dla operatora przeciążenia, że Zajęcia ref .NET Oczekuj (wręcz przeciwnie, oznacza to również, że klasy ref obecne w ramach. Net odnoszą się do operatorów przeciążenia, często domyślnie zaimplementowane w C ++/CLI.

Na przykład porównanie dwóch ciągów odniesienia (ciąg^) za pośrednictwem operatora == Zwróci „true” (true) niezależnie od tego. Będąc statycznym operatorem przeciążenia, wykonaj odlew do obiektu^ usuwa semantykę przeciążenia.

// Wpływ na odniesienie operatora przeciążenia  Strunowy  ^ S1  =  "ABC" ;  Strunowy  ^ S2  =  „AB”  +  "C" ;  Obiekt  ^ O1  =  S1 ;  Obiekt  ^ o2  =  S2 ;  S1  ==  S2 ;  // prawda, ponieważ odnoszą się do tego samego obiektu  O1  ==  o2 ;  // Fałsz, ponieważ nie są tym samym obiektem  

Nowy C ++/CX w celu WinRT, chociaż produkuje całkowicie „niezarządzany” kod, pożycza koncepcję ref i składni ^ w celu odniesienia do zliczania komponentów WinRT, które są podobne do obiektów COM. [2]

after-content-x4