Почему статические конструкторы не имеют параметров

согласно MSDN:

статический конструктор не принимает модификаторы доступа и не имеет параметров.

статический конструктор вызывается автоматически для инициализации класса до создания первого экземпляра или ссылки на любые статические члены.

статический конструктор нельзя вызвать напрямую.

может ли кто-нибудь объяснить, почему статический конструктор не может иметь параметров.

9 ответов


Как говорит MSDN,статический конструктор вызывается автоматически для инициализации класса перед созданием первого экземпляра. Поэтому вы не можете отправить ему какие-либо параметры.

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


статические конструкторы вызываются автоматически, как часть инициализации типа. Они не называются явно... таким образом, вы нигде не можете предоставить какие-либо аргументы, соответствующие параметрам конструктора. Почему вы хотите разрешить параметры, если вы никогда не могли указать какие-либо значения для Аргументов?


Как бы вы управляли аргументами, которые были переданы такому конструктору, учитывая, что он вызывается автоматически во время выполнения, когда класс ссылается в первый раз, и не может быть вызван напрямую?

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


потому что вы не можете вызвать его напрямую (согласно MSDN):

статический конструктор нельзя вызвать напрямую.


статический конструктор не имеет параметров. Ну, я полагаю, что это может теоретически-но нет экземпляра класса, поэтому это не имело бы никакого смысла. Что бы вы сделали с этими параметрами, если бы они у вас были? Вызвать другие статические методы?


  • статический конструктор вызывается автоматически перед первым экземпляром класс создан.
  • объявлено путем префикса статического ключевого слова к определению конструктора.
  • Он не может не принимать модификаторы доступа или иметь какие-либо параметры.

создайте пустой конструктор для статического класса и поместите параметризованный код в нормальную функцию. При вызове этой функции будет создан статический класс.

статический класс:

static class DataB
{
    static DataB(){}

    public static void funcWithParams(string st)
    {...}
}

вы можете создать его, как это:

DataB.funcWithParams("some string");

Статический Конструктор

поскольку статический конструктор вызывается автоматически (у нас нет никакого контроля над вызовом статического конструктора), поэтому мы не можем передать параметр статическому конструктору.

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

Итак, мы должны иметь параметр меньше статического конструктора.


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

public partial class Form1 : Form
{
    public int nWow;

    public Form1()
    {
        InitializeComponent();
        Inner.AssignMe(this); // This is where the real action is.
    }

    class Inner
    {
        static Form1 Me;

        static Inner(){} // empty static constructor necessary

           // Called AssignMe in the Form1 constructor in this code, 
           // but this can be generalized to any nested class.
        public static void AssignMe(Form1 form) { Me = form; }

        public Inner() { Me.nWow = 1; } // Now u can access public Form1
    }                        // members and methods even from the nested
}                            // class' constructor.

Я понял это, основываясь на сообщении user3567816 выше, которое, хотя и краткое и имеющее 0 голосов, никогда не является менее элегантным решением и очень уникальным. Никто другой не дает такого совета на подобные вопросы. БОЛЬШЕ НЕТ УРОДЛИВЫХ ИЗБЫТОЧНЫХ ПАРАМЕТРОВ ФОРМЫ В КОНСТРУКТОРАХ ВЛОЖЕННЫХ КЛАССОВ! Это просто гениально!!

Я не мог не дать VB.Net twist с использованием статической переменной name Me. Ухмыляться.