Почему статический конструктор не имеет параметров? - PullRequest
21 голосов
/ 21 июля 2011

Для MSDN:

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

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

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

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

Ответы [ 9 ]

24 голосов
/ 21 июля 2011

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

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

8 голосов
/ 21 июля 2011

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

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

8 голосов
/ 21 июля 2011

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

4 голосов
/ 21 июля 2011

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

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

2 голосов
/ 21 июля 2011

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

0 голосов
/ 15 декабря 2015

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

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

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

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

0 голосов
/ 05 августа 2015

Вот пример метода, позволяющего вложенным классам получать доступ к элементам управления формы БЕЗ ПЕРЕДАЧИ ФОРМЫ В КАЧЕСТВЕ ПАРАМЕТРА КОНСТРУКТОРУ ВСТРОЕННОГО КЛАССА:

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 поворот с использованием статической переменной с именем Me.Ухмылка.

0 голосов
/ 13 ноября 2014

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

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

static class DataB
{
    static DataB(){}

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

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

DataB.funcWithParams("some string");
0 голосов
/ 17 октября 2014
  • Статический конструктор вызывается автоматически перед первым класс создан.
  • Объявляется путем добавления префикса static к определению конструктора.
  • Он не может не принимать модификаторы доступа или иметь какие-либо параметры.
...