Подтвердить что ты не робот

С# частный, статический и readonly

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

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

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

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

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

readonly означает, что вы можете читать только значение и не можете его назначить.

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

//большое обсуждение SO о них
Что так плохо о одиночных играх?