При инициализации в конструкторах C#, что лучше: списки инициализатора или присвоение?

Если у вас есть строка Unicode, и вы хотите записать ее в файл или в другую сериализованную форму, вы должны сначала закодировать в конкретное представление, которое можно сохранить. Существует несколько общих кодировок Unicode, таких как UTF-16 (для большинства символов Unicode используются два байта) или UTF-8 (1-4 байта / код в зависимости от символа) и т. Д. Чтобы преобразовать эту строку в конкретную кодировку, вы может использовать:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

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

При записи в файлы вы можете избавиться от этого ручного процесса кодирования / декодирования, используя модуль кодеков . Итак, чтобы открыть файл, который кодирует все строки Unicode в UTF-8 , используйте:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

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

В Python 3 эта форма файла доступ по умолчанию, а встроенная функция open будет принимать параметр кодировки и всегда переводить в / из строк Unicode (стандартный строковый объект в Python 3) для файлов, открытых в текстовом режиме.

28
задан mindless.panda 12 March 2010 в 19:19
поделиться

3 ответа

Первый из них недопустим в C #. Единственные два элемента, которые могут появиться после двоеточия в конструкторе, - это base и this .

Так что я бы выбрал второй.

81
ответ дан 28 November 2019 в 02:20
поделиться

С C# 7.0, существует способ оптимизировать это с органами по выражению:

A(String filename) => _filename = filename;

(Взгляды лучше с двумя полями, хотя):

A(String filename, String extension) => (_filename, _extension) = (filename, extension);
2
ответ дан 28 November 2019 в 02:20
поделиться

Вы имели в виду C++, а не C#?

Для C++ списки инициализаторов лучше, чем присваивание по нескольким причинам:

  • Для POD-типов (int, float и т.д.) оптимизатор часто может сделать более эффективную memcpy за кулисами, когда вы предоставляете инициализаторы для данных.
  • Для не POD-типов (объекты) эффективность достигается за счет выполнения только одной конструкции. При присваивании в конструкторе компилятор должен сначала построить ваш объект, а затем присвоить его на отдельном шаге (это относится и к POD-типам).
17
ответ дан 28 November 2019 в 02:20
поделиться
Другие вопросы по тегам:

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