2013-07-31 3 views
3

Почему C# позволяет инициализировать переменные статического класса в нестационарном contructor? Статическим переменным должно быть разрешено только инициализировать статические конструкторы. Есть идеи?Почему C# позволяет инициализировать переменные статического класса в нестационарном конструкторе?

public class customer 
{ 
    public string Name; 

    public customer() 
    { 
     Name = "C1"; 
     Console.WriteLine("creating customer " + Name); 
    } 

} 

class Program 
{ 
    public static customer cust; 

    public Program() 
    { 
     cust = new customer(); //Why is this allowed i.e. initialize a static variable in non-static constructor? 
    } 

    static void Main(string[] args) 
    { 
     Program program = new Program(); 
     program = new Program(); 

     Console.Read(); 
    } 
} 
+5

Почему это не должно допускать этого? Что делать, если вы хотите инициализировать статическую переменную при создании экземпляра класса? Или, возможно, увеличивайте счет каждый раз, когда объект будет обновлен. –

+2

Вы можете обновить его из * любого * метода, нет ничего особенного в конструкторе. Вы забыли объявить это * readonly *? –

ответ

10

Не смотрите на это как на инициализацию, посмотрите на него как на настройку.

Если вы хотите, чтобы он был инициализирован с помощью статического конструктора или объявления, добавьте ключевое слово readonly.

Э.Г.

public readonly static customer cust; 

//Allowed 
static Program() 
{ 
    cust = new customer(); 
} 

//Not Allowed 
public Program() 
{ 
    cust = new customer(); 
} 
+0

, так что статического ключевого слова недостаточно для принудительной одиночной инициализации? Это отличается от C++. – naveed

+6

@naveed C# не C++. –

0

Это просто означает, что статическая переменная сбрасывается каждый раз при инициализации нового объекта. Немного странно, но компилятор позволяет это.

+0

yep, true. Не имеет смысла. Если я объявляю и инициализирую статическую переменную одновременно, она инициализируется только один раз. – naveed

+0

@naveed Вам не хватает смысла. Вы тот, кто делает глупую вещь, а не компилятор. Статический конструктор обрабатывает инициализацию статических членов, однако статический просто означает «доступный без экземпляра», а не «присваиваемый только один раз». Если вы хотите, чтобы поле было назначено только однократно, в конструкторе вы можете использовать ключевое слово 'readonly'. Не предполагайте, что, поскольку ключевое слово имеет то же имя, что и на другом языке, оно должно быть одинаковым. 'static' в C++ аналогичен по своей концепции, но все еще отличается от' static' в C#. Кроме того, вам не нужно было объявлять как 'const static' в C++ тоже? – Luaan

2

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

4

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

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

С учетом сказанного вы хотели бы знать о статических объектах в классе перед инициализацией и проверять, являются ли они нулевыми, прежде чем перезаписывать их значения.

Смежные вопросы