Я пытаюсь использовать статический конструктор, например:
public static DataManager()
{
LastInfoID = 1;
}
и получить эту ошибку:
Модификаторы доступане допускаются к статическим конструкторам
Я хотел бы знать, что моя проблема.
Я пытаюсь использовать статический конструктор, например:
public static DataManager()
{
LastInfoID = 1;
}
и получить эту ошибку:
Модификаторы доступане допускаются к статическим конструкторам
Я хотел бы знать, что моя проблема.
У статического конструктора есть модификатор доступа нет: это просто:
static DataManager() // note no "public"
{
LastInfoID = 1;
}
Это потому, что он никогда не вызывается явно (кроме, быть может, через отражение), но вызывается средой выполнения; уровень доступа будет бессмысленным.
Проблема в том, что поле или свойство LastInfoID
не объявлено как static в вашем классе, и вы можете получить доступ только к статическим членам из статический конструктор. Также удалите ключевое слово public
из объявления:
static DataManager()
{
LastInfoID = 1;
}
Удалите public
. Синтаксис для статического конструктора:
class MyClass
{
static MyClass()
{
// Static constructor
}
}
Чтобы дать кому-либо здесь более четкий ответ, без примера, подумайте, почему вам придется обращаться к статическому конструктору извне? Статические классы создаются в памяти при выполнении приложения, поэтому они статичны. Другими словами, вам НИКОГДА не нужно будет вызывать одно явно, и если вы это сделаете, скажите через отражение (которое я не знаю, если это позволит вам), тогда вы делаете что-то неправильно.
Когда вы создаете новый экземпляр класса, конструктор существует как способ инициализировать все внутренние переменные и выполнять любую обработку, необходимую для того, чтобы сделать функцию класса таким, каким она предназначена. Обратите внимание: если вы не укажете конструктор, компилятор создаст его для вас. По этой причине вам все равно нужно создать класс с "()" так
new MyClass();
потому что вы вызываете конструктор по умолчанию (при условии, что у вас нет параметра без параметров). Другими словами, причина, по которой нестатический конструктор должен быть определен как открытый, заключается в том, что вам нужно явно его вызывать. Если память мне хорошо помогает, С# не будет компилировать код, который пытается вызвать конструктор (через malloc), который не определен как открытый.
Конструкторы в статическом классе существуют для целей "настройки". Например, у меня может быть статический класс, который должен быть мостом между моим кодом и файлом, который я постоянно сохраняю и считываю данные. Я могу определить конструктор, который при создании объекта будет следить за тем, чтобы файл существовал, а если не создает по умолчанию (очень полно в веб-системах, которые портированы на другие серверы).
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
*/