2017-02-15 104 views
12

Zgodnie z sekcją "10.12 Konstruktory statyczne" w "Specyfikacji języka C# wersji 5.0", konstruktor statyczny może być oznaczony modyfikatorem "zewnętrznym" iw tym przypadku jest on oznaczony jako zewnętrzny konstruktor statyczny .Jaki jest cel zewnętrznych konstruktorów statycznych w języku C#?

Zwykłe konstrukcje statyczne (nie z zewnątrz) są dobrze znane. Służą do inicjalizacji pól i właściwości statycznych.

Zewnętrzne metody statyczne są często używane do wywoływania funkcji natywnych poprzez P/Invoke.

I jestem również świadomy dość ezoterycznych konstruktorów extern (patrz także this question). Na przykład klasa String ma kilka takich declarations, te konstruktory są implementowane przez środowisko wykonawcze.

Ale jakie są rzeczywiste zastosowania zewnętrznych konstruktorów statycznych? Przeszukałem numer coreclr repo i nic nie znalazłem. Specyfikacja językowa nie mogła dać opisu konstrukcji, która nigdy nie była używana w środowisku naturalnym. A może?

Moje przypuszczenie: C# ma zewnętrzne statyczne konstruktory tylko dlatego, że CLR je obsługuje (w zasadzie).

+0

Myślę, że znajdziesz bardzo podobny fragment tekstu w każdym podrozdziale sekcji 10 od 10.6 (Metody) do 10.13 (Destruktory). Jeśli nic więcej, to przynajmniej jest spójne *. –

+1

Jedyną rzeczą 'extern' jest ustawienie wartości RVA metody na 0. Środowisko wykonawcze pozostało do obliczenia reszty. Zobacz także http://stackoverflow.com/q/38015024/. Nie ma powodu, żeby specyfikacja językowa zabraniała tego, ponieważ praca kompilatora jest trywialna (więcej pracy byłoby zabronione). Ponadto, ponieważ konstruktorów nie można oznaczyć 'DllImport', jedynym sposobem na wdrożenie takich metod jest' MethodImplOptions.InternalCall', więc środowisko wykonawcze jest jedynym możliwym konsumentem, przez co jeszcze mniej interesujące jest jawne zabranie go. –

+0

Co do tego, dlaczego nie są one faktycznie używane, to jest w sferze spekulacji, ale gdybym był implementatorem CLR, zdecydowanie wolałbym wykonywać moją statyczną inicjalizację w łatwych do przewidzenia miejscach, niż polegać na dość tajemniczych regułach do inicjalizacji typów statycznych. Cały ten kod wraca do środowiska wykonawczego, więc nie zrobiłoby nic, tylko uczyniłoby moją pracę trudniejszą. –

Odpowiedz

1

od MSDN:

Jeżeli zgłoszenie konstruktor zawiera modyfikator extern, konstruktor mówi się konstruktora zewnętrznych. Ponieważ zewnętrzna deklaracja konstruktora nie zapewnia faktycznej implementacji, jego konstruktor-korpus składa się ze średnika.

...

Wydaje się, że nie można myśleć o dobry powód korzystania z tej deklaracji i na pewno prawidłowe. Ale kiedy będziesz dalej kopał, zdasz sobie sprawę, że istnieje cały świat dynamicznego montażu lub - Generowanie kodu.

Jeśli miałbyś opracować kompilator dla platformy .NET, prawdopodobnie będziesz potrzebował pewnych sztuczek, podobnie jak używa kompilatora C#. Zdaję sobie sprawę, że niektóre podstawowe implementacje używają zewnętrznego konstruktora, który jest implementowany gdzie indziej z dobrych powodów projektowych.