Статическое ключевое слово в С#

Я действительно путаюсь с реальным значением ключевого слова static в С#. Я просмотрел разные статьи в Интернете, но никто из них не помогает мне понять это значение, а другим источникам не доверяют. Я знаю, что у Qaru есть некоторые блестящие умы, которые могут помочь мне понять реальный смысл статического, как

  • Когда они инициализируются.
  • статические методы, свойства, классы и конструкторы
  • Static vs readonly vs constant

Ответ 1

Короче говоря, static эффективно означает "связанный с типом, а не с одним экземпляром типа". Таким образом, существует один набор статических переменных для типа (внутри AppDomain), есть ли у вас 0 экземпляров или миллион; вам не нужен экземпляр для доступа к статическому члену и т.д.

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

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

Иногда вы можете видеть, что static описывается как "разделяемый между всеми экземплярами типа" - мне лично не нравится это описание, поскольку оно предполагает, что должен быть хотя бы один экземпляр... тогда как на самом деле вы не знаете, t нужны какие-либо экземпляры, чтобы использовать статический член. Я предпочитаю думать о них как о совершенно разных, а не о "совместном использовании" между экземплярами.

Ответ 2

Я могу порекомендовать эту статью, она выглядит довольно описательно: Статическое ключевое слово Demystified

Я также рекомендовал бы официальную статью руководства по программированию С#, которая охватывает различные применения статического ключевого слова. Вы можете перейти оттуда, так как существует множество ссылок на различные статьи MSDN.: Статические классы и члены статического класса (Руководство по программированию на С#)

Ответ 3

Немного о константе (const) и readonly:

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

Использование примеров:

constant: 
const  int a=10; // value cannot be modified, value is known at compile time

Но что делать, когда мы хотим, чтобы постоянное значение поля было неизвестно во время компиляции?

e.g const PersonClass a=new PersonClass("name"); // error

Ответ - это поле только для чтения:

readonly:
readonly PersonClass a=new PersonClass("name"); // all correct

Ответ 4

Из документации:

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

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

Static, свойства являются частями класса, а не экземпляра.

Static не имеет ничего общего с readonly или constant. Static - это способ, как и член, readonly и constant - это путь, как элемент, который хранится/управляется.