C#, частный, статичный, и только для чтения

Пожалуйста, посмотрите пример ImagesInChunkInCell . Вместо пули я взял изображение лампочки. Я смог воспроизвести описанную вами проблему, но, как вы можете видеть в list_with_images.pdf , мне удалось добавить одну дополнительную строку:

Image image = Image.getInstance(IMG);
image.setScaleToFitHeight(false);
PdfPTable table = new PdfPTable(1);
table.setTotalWidth(new float[]{120});
table.setLockedWidth(true);
Phrase listOfDots = new Phrase();
for (int i = 0; i < 40; i++) {
    listOfDots.add(new Chunk(image, 0, 0));
    listOfDots.add(new Chunk(" "));
}
table.addCell(listOfDots);

Дополнительная строка :

image.setScaleToFitHeight(false);

Это предотвращает масштабирование изображения.

24
задан victor hugo 9 June 2009 в 06:22
поделиться

8 ответов

  • private Никто не должен использовать поле регистратора вне класса (даже в подклассах), если вы не установите это значение, любой другой класс может использовать ваше регистратор для входа в ваш класс » name.
  • static Атрибут прикреплен к классу, поэтому он не будет повторять с каждым экземпляром класса. Если вы не установите это значение, атрибут регистратора будет занимать дополнительное место в памяти с каждым экземпляром объекта, создаваемым системой (вы это неправильно поняли).
  • readonly Поле регистратора не должно изменяться.
45
ответ дан 28 November 2019 в 22:35
поделиться

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

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

1
ответ дан 16 October 2019 в 08:02
поделиться

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

1
ответ дан 16 October 2019 в 08:02
поделиться

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

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

9
ответ дан 28 November 2019 в 22:35
поделиться

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

6
ответ дан 28 November 2019 в 22:35
поделиться

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

2
ответ дан 28 November 2019 в 22:35
поделиться

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

2
ответ дан 28 November 2019 в 22:35
поделиться

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

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

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

1
ответ дан 28 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: