2012-07-02 2 views
13

Модификаторы доступа, такие как public, private, не допускаются к статическим конструкторам на C#. Тем не менее, анализ кода Visual Studio имеет предупреждение в категории безопасности C#, в котором указано «CA2121: Static constructors should be private».Как статические конструкторы могут быть сделаны не частными?

Можно ли сделать статический конструктор не-частным? Или это ошибка анализа кода Visual Studio?

CLARIFICATION: Я не пытаюсь сделать какой-либо конструктор не-частным. Итак, почему? вопросы не имеют значения. Мне просто интересно о противоречии между двумя инструментами Microsoft и хочу узнать, есть ли что-то, что я не знаю о том, как обрабатываются статические конструкторы.

+0

Цитата из вышеприведенной ссылки: 'Пользователь не имеет контроля над вызовом статического конструктора. Если статический конструктор не является приватным, его можно вызывать кодом, отличным от системы. В зависимости от операций, выполняемых в конструкторе, это может вызвать непредвиденное поведение. « – Tisho

+1

Я думаю, соответствующая цитата« Это правило применяется компиляторами C# и Visual Basic .NET ». Итак, нет, вы не можете сделать его не-частным в C#. – Henrik

ответ

9

Статический конструктор C# всегда является приватным. Вы никогда не должны видеть это предупреждение для кода C#, и предупреждение там не полезно. Однако анализ кода доступен и для других языков, и это другие языки, которые могут заставить вас писать классы с нестандартными статическими конструкторами.

+0

Тогда почему это указано как применимое к C#? Вы думаете, что это ошибка? –

+0

@ssg Где это указано? – hvd

+0

@ssg Если вы имеете в виду «Это правило применяется компиляторами C# и Visual Basic .NET.», упомянутый в комментарии к вашему вопросу, то нет, это означает, что компилятор уже гарантирует, что статические конструкторы являются частными, то есть это предупреждение никогда не должно срабатывать. – hvd

3

Если вы читали документы ясно говорится

Если статический конструктор не является частным, его можно назвать кодом, отличной от системы. В зависимости от операций, выполняемых в конструкторе, это может привести к неожиданному поведению.

Я полагаю, что более важный вопрос будет почему вы хотите?

+0

Дело в том, что я не могу. Компилятор выдает ошибку, когда я пытаюсь добавить статический файл с помощью модификатора доступа. Может быть, на уровне ИЛ? –

+0

C# не позволяет cctor быть не закрытым, см. Комментарий Хендрикса выше. – usr

+0

@ssg Я бы спросил себя * почему * вам нужно, чтобы оно было чем-то иным, чем «частным». Я бы сказал, что ваш дизайн скорее всего ошибочен, чем команда C#, упустившая трюк для использования нестандартных статических конструкторов. – James

1

Возможно ли сделать статический конструктор не приватным?

В чем смысл этого?

Статический конструктор называется моментом, когда класс загружается из компоновщика, прежде чем какой-либо метод выполнится. Таким образом, статический конструктор нельзя было бы разумно называть вне автоматического вызова от компоновщика, а это значит, что нет смысла в нем иметь какой-либо модификатор доступа.

В принципе, вы не можете ссылаться на класс БЕЗ ИСПОЛНЕНИЯ СТАТИЧЕСКОГО ИЗМЕНЕНИЯ - и это до того, как ваш код, содержащий эталон, выполняется.