В C# частные, static и readonly

Я просматривал код для log4net и я наткнулся на это.

private static readonly ILog logger = LogManager.GetLogger(typeof(AdminClient));

Мне интересно, почему вам нужно иметь только частное статическое чтение.

из моего понимания private означало бы, что переменная не может использоваться вне класса, если нет метода доступа или свойства get.

static будет означать, что переменная ограничена только в этом файле.

readonly будет означать, что вы можете читать только из значения и не удается назначить его.

Итак, я думаю, что человек, который писал этот код. объявили его частным, поскольку они не хотят, чтобы он использовался вне класса и статическим, чтобы он не использовался вне файла. Однако, если есть свойство get, статическое предотвратит эту форму.

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

большое спасибо за любые советы,

9 ответов


  • частная никто не должен использовать поле регистратора вне класса (даже в подклассах), если вы не установите это, любой другой класс может использовать ваш регистратор для входа в имя вашего класса.
  • static атрибут прикрепленный в класс, чтобы он не повторить С каждым экземпляром класса. Если вы не установите этот параметр, атрибут logger будет занимать дополнительное место в памяти с каждым экземпляром, который система делает из объекта (вы поняли это).
  • только для чтения поле регистратора не должно быть изменено.

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

хотя хороший вопрос!


static делает не означает, что к нему нельзя получить доступ из других файлов - это не C. ключевое слово static означает, что объект logger является переменной класса вместо переменной экземпляра, поэтому даже при доступе из разных объектов этого класса все они будут ссылаться на один и тот же объект logger.


static в c# означает, что член связан с классом, а не с экземпляром класса. Только чтение важно, потому что в c# большинство переменных, и в частности эта, являются ссылочными переменными. Readonly означает, что эта переменная всегда будет ссылаться на один и тот же регистратор.


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


A только для чтения переменная очень похожа на const в том, что значение является постоянным на протяжении всего срока службы. Разница в том, что переменная readonly инициализируется во время выполнения, а const-во время компиляции. Static, в терминах непрофессионалов, означает, что экземпляр переменной не зависит от экземпляра объекта, в котором он объявлен. Его время жизни сохраняется от вызова функции к вызову функции. Статическая переменная быстрее доступна, потому что ее хранилище остается выделенным на весь срок действия программы. Итак, зная это, мы можем вернуться к вашему вопросу.

Почему "logger" является статическим членом? Это дизайнерское решение. Мне нужно знать, как вы используете его, чтобы ответить на этот вопрос. Почему только для чтения? Потому что кажется, что он инициализирован один раз, и его экземпляр используется повсюду. Мы можем убедиться, что никто больше не вмешивается в значение logger, сделав его "только для чтения" сразу после его инициализации.


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

logger = LogManager.GetLogger(typeof(AdminClient));

где-либо еще в нашем классе. С readonly он просто не будет компилироваться (если он не был инициализирован раньше,и мы в конструктор (static))


статические переменные попадают в категорию "переменных класса", переменная класса-это та, которая связана с классом вместо объекта класса, с другой стороны, переменные экземпляра-это переменные, которые ассоциированы с объектом класса.каждый раз, когда объект класса intialized, этот объект будет иметь свою собственную копию этой" переменной экземпляра " (нестатическая), в то время как статическая переменная разделяется между всеми объектами классов в запущенной программе, как размер связанного списка и т. д. readonly-это ключевое слово c#, которое используется для создания переменной только для чтения, java не предоставляет такого средства, которое вы должны написать общедоступный метод для доступа к переменным, которые вы не хотите закалять.


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

// материнский корабль материал о синглетах
http://msdn.microsoft.com/en-us/library/ff650316.aspx
http://msdn.microsoft.com/en-us/library/ff650849.aspx

/ / отличная так дискуссия о них
Что плохого в синглетах?