2012-07-02 15 views
13

Modyfikatory dostępu, takie jak public, private, nie są dozwolone na statycznych konstruktorach w języku C#. Jednak analiza kodu Visual Studio ma ostrzeżenie w kategorii bezpieczeństwa C#, które mówi "CA2121: Static constructors should be private".W jaki sposób konstruktory statyczne mogą być nieprywatne?

Czy możliwe jest wykonanie statycznego konstruktora jako nieprywatnego? Czy jest to błąd analizy kodu Visual Studio?

CLARIFICATION: Nie próbuję uczynić żadnego konstruktora nieprywatnym. Więc dlaczego?" pytania są nieistotne. Po prostu ciekawi mnie sprzeczność między dwoma narzędziami Microsoftu i chcę zobaczyć, czy jest coś, czego nie wiem o tym, jak traktuje się statyczne konstruktory.

+0

Cytat z powyższego linku: 'Użytkownik nie ma kontroli nad wywołaniem konstruktora statycznego. Jeśli konstruktor statyczny nie jest prywatny, może być wywołany przez kod inny niż system. W zależności od operacji wykonywanych w konstruktorze może to spowodować nieoczekiwane zachowanie. " – Tisho

+1

Myślę, że odpowiedni cytat to" Ta reguła jest egzekwowana przez kompilatory C# i Visual Basic .NET. " Tak, nie, nie można uczynić go nieprywatnym w języku C#. – Henrik

Odpowiedz

9

Konstruktor statyczny C# jest zawsze prywatny. Nigdy nie powinieneś widzieć tego ostrzeżenia dla kodu C#, a ostrzeżenie nie jest tam użyteczne. Analiza kodu jest również dostępna dla innych języków, a te inne języki mogą powodować pisanie klas za pomocą nieprywatnych konstruktorów statycznych.

+0

Więc dlaczego jest to określone jako mające zastosowanie do C#? Czy uważasz, że to błąd? –

+0

@ssg Gdzie to jest powiedziane? – hvd

+0

@ssg Jeśli masz na myśli: "Ta reguła jest egzekwowana przez kompilatory C# i Visual Basic .NET."wspomniane w komentarzu do twojego pytania, a następnie nie, oznacza to, że kompilator już zapewnia, że ​​statyczne konstruktory są prywatne, co oznacza, że ​​to ostrzeżenie nigdy nie powinno być wyzwalane. – hvd

3

Jeśli czytasz docs wyraźnie stwierdza

Jeśli statyczny konstruktor nie jest prywatny, może być wywołana przez kod inny niż system. W zależności od operacji wykonywanych w konstruktorze może to spowodować nieoczekiwane zachowanie.

Przypuszczam, że ważniejsze pytanie będzie , dlaczego chcesz?

+0

Chodzi o to, że nie mogę. Kompilator zgłasza błąd podczas próby dodania statycznego z modyfikatorem dostępu. Może na poziomie IL? –

+0

C# nie pozwala, aby cctor nie był prywatny, zobacz komentarz Hendriks powyżej. – usr

+0

@ssg Chciałbym zadać sobie pytanie * dlaczego * potrzebujesz tego, aby być czymś innym niż "prywatny". Mogę śmiało powiedzieć, że twój projekt prawdopodobnie jest bardziej błędny, niż ekipa C#, która nie ma luki w używaniu nieprywatnych konstruktorów statycznych. – James

1

Czy możliwe jest wykonanie statycznego konstruktora jako niepublicznego?

Jaki byłby sens tego?

Statyczny konstruktor jest nazywany momentem załadowania klasy z łącznika przed wykonaniem dowolnej metody. Jako taki, konstruktor statyczny nie może być sensownie wywoływany poza wywołaniem automatycznym z łącznika, co oznacza, że ​​nie ma sensu w nim mieć żadnego modyfikatora dostępu.

Zasadniczo nie można odwoływać się do klasy BEZ WYKONYWANIA STATYCZNEGO MODYFIKATORA - i to przed wykonaniem kodu, który zawiera odwołanie.

Powiązane problemy