Подтвердить что ты не робот

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

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

public static DataManager()
{
    LastInfoID = 1;
}

и получить эту ошибку:

Модификаторы доступа

не допускаются к статическим конструкторам

Я хотел бы знать, что моя проблема.

4b9b3361

Ответ 1

У статического конструктора есть модификатор доступа нет: это просто:

static DataManager() // note no "public"
{
    LastInfoID = 1;
}

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

Ответ 2

Проблема в том, что поле или свойство LastInfoID не объявлено как static в вашем классе, и вы можете получить доступ только к статическим членам из статический конструктор. Также удалите ключевое слово public из объявления:

static DataManager()
{
    LastInfoID = 1;
}

Ответ 3

Удалите public. Синтаксис для статического конструктора:

class MyClass 
{
    static MyClass() 
    {
        // Static constructor
    }
}

Ответ 4

Чтобы дать кому-либо здесь более четкий ответ, без примера, подумайте, почему вам придется обращаться к статическому конструктору извне? Статические классы создаются в памяти при выполнении приложения, поэтому они статичны. Другими словами, вам НИКОГДА не нужно будет вызывать одно явно, и если вы это сделаете, скажите через отражение (которое я не знаю, если это позволит вам), тогда вы делаете что-то неправильно.

Когда вы создаете новый экземпляр класса, конструктор существует как способ инициализировать все внутренние переменные и выполнять любую обработку, необходимую для того, чтобы сделать функцию класса таким, каким она предназначена. Обратите внимание: если вы не укажете конструктор, компилятор создаст его для вас. По этой причине вам все равно нужно создать класс с "()" так

     new MyClass();

потому что вы вызываете конструктор по умолчанию (при условии, что у вас нет параметра без параметров). Другими словами, причина, по которой нестатический конструктор должен быть определен как открытый, заключается в том, что вам нужно явно его вызывать. Если память мне хорошо помогает, С# не будет компилировать код, который пытается вызвать конструктор (через malloc), который не определен как открытый.

Конструкторы в статическом классе существуют для целей "настройки". Например, у меня может быть статический класс, который должен быть мостом между моим кодом и файлом, который я постоянно сохраняю и считываю данные. Я могу определить конструктор, который при создании объекта будет следить за тем, чтобы файл существовал, а если не создает по умолчанию (очень полно в веб-системах, которые портированы на другие серверы).

Ответ 5

using System;

public class Something
{
    //
    private static  DateTime _saticConstructorTime;
    private         DateTime _instanceConstructorTime;
    //
    public static DateTime SaticConstructorTime
    {
        set { _saticConstructorTime = value; }
        get { return _saticConstructorTime ; }
    }
    public DateTime InstanceConstructorTime
    {
        set { _instanceConstructorTime = value; }
        get { return _instanceConstructorTime; }
    }
    //Set value to static propriety 
    static Something()
    {
        SaticConstructorTime = DateTime.Now;
        Console.WriteLine("Static constructor has been executed at: {0}",
                        SaticConstructorTime.ToLongTimeString());
    }
    //The second constructor started alone at the next instances
    public Something(string s)
    {
        InstanceConstructorTime = DateTime.Now;
        Console.WriteLine("New instances: "+ s +"\n");
    }
    public void TimeDisplay(string s)
    {
        Console.WriteLine("Instance \""+ s + "\" has been created at: " + InstanceConstructorTime.ToLongTimeString());
        Console.WriteLine("Static constructor has been created at: " + SaticConstructorTime.ToLongTimeString() + "\n");
    }
}
//
class Client
{
    static void Main()
    {
        Something somethingA = new Something("somethingA");
        System.Threading.Thread.Sleep(2000);
        Something somethingB = new Something("somethingB");

        somethingA.TimeDisplay("somethingA");
        somethingB.TimeDisplay("somethingB");
        System.Console.ReadKey();
    }
}
/* output :

Static constructor has been executed at: 17:31:28
New instances: somethingA

New instances: somethingB

Instance "somethingA" has been created at: 17:31:28
Static constructor has been created at: 17:31:28

Instance "somethingB" has been created at: 17:31:30
Static constructor has been created at: 17:31:28
 */