Статическое ключевое слово в c # - PullRequest
46 голосов
/ 23 февраля 2012

Я действительно запутался с реальным значением статического ключевого слова в C #. Я просматривал различные статьи в интернете, но ни одна из них не помогает мне понять его значение, и другим источникам не доверяют. Я знаю, что у Stack Overflow есть несколько блестящих умов, которые могут помочь мне понять реальное значение статики, например

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

Ответы [ 4 ]

84 голосов
/ 23 февраля 2012

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

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

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

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

12 голосов
/ 23 февраля 2012

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

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

8 голосов
/ 23 февраля 2012

Немного о константе (const) и только для чтения:

  • константа или константная переменная, которая не может быть изменена, и какое значение известно во время компиляции.
  • 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
7 голосов
/ 23 февраля 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...