Статический конструктор в C # - PullRequest
41 голосов
/ 07 ноября 2010

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

public static DataManager()
{
    LastInfoID = 1;
}

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

модификаторы доступа не разрешены для статических конструкторов

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

Ответы [ 5 ]

97 голосов
/ 07 ноября 2010

Статический конструктор имеет нет модификатор доступа: это просто:

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

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

5 голосов
/ 07 ноября 2010

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

class MyClass 
{
    static MyClass() 
    {
        // Static constructor
    }
}
5 голосов
/ 07 ноября 2010

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

static DataManager()
{
    LastInfoID = 1;
}
4 голосов
/ 22 января 2013

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

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

     new MyClass();

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

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

1 голос
/ 09 декабря 2016
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
 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...