C # приватный, статический и только для чтения - PullRequest
24 голосов
/ 09 июня 2009

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

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

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

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

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

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

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

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

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

Ответы [ 9 ]

45 голосов
/ 09 июня 2009
  • private Никто не должен использовать поле logger вне класса (даже в подклассах), если вы не установите этот параметр, любой другой класс может использовать ваш logger для входа в систему под именем вашего класса.
  • static Атрибут присоединен к классу, поэтому он не будет повторяться с каждым экземпляром класса. Если вы не укажете это, атрибут logger будет занимать дополнительное место в памяти при каждом экземпляре объекта, создаваемом системой (вы неправильно это поняли).
  • только для чтения Поле регистратора не следует изменять.
9 голосов
/ 09 июня 2009

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

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

6 голосов
/ 09 июня 2009

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

2 голосов
/ 09 июня 2009

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

2 голосов
/ 09 июня 2009

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

1 голос
/ 09 сентября 2009

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

1 голос
/ 09 июня 2009

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

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

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

1 голос
/ 09 июня 2009
Переменная

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

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

0 голосов
/ 07 июня 2013

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

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

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

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