Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Файлы CSV в качестве предлагаемого названия должны быть разделены запятыми и не зависят от локальных. Однако то, что вы могли бы сделать, чтобы избежать этой проблемы, - это двойная кавычка соответствующих десятичных чисел в файле CSV как таковая: "10,20", "1,50", "This is another column"
. Это должно полностью исключить проблему для любого достойного CSV-парсера (например, библиотеки FileHelpers ), которая будет читать это как 10,20
и 1,50
, а не как: 10
, 20
, 1
и 50
.
См. CSV :
Более сложные реализации CSV допускают запятые и другие специальные символы в значении поля. Многие реализации используют символы (двойные кавычки) вокруг значений, которые содержат зарезервированные символы (такие как запятые, двойные кавычки или символы новой строки); встроенные символы двойной кавычки могут быть представлены двумя последовательными двойными кавычками
blockquote>
Использование:
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
Запись CSV: строка разделителя списков должна использоваться как разделители в CSV (см. ниже, как изменить эту переменную). Изменение значения «разделителя списков» также отражается в Excel при сохранении в качестве CSV.
Чтение CSV: определение разделителя в CSV - это еще одна история, и это немного сложнее. В принципе, можно использовать «,» как разделитель CSV в одной системе и использовать «;» или даже «*» или любой («строка») в качестве разделителя в другой системе. В этой статье содержится некоторое представление о том, как обнаружить разделители CSV, где считываются файлы CSV с межсистемными системами:
http : //www.codeproject.com/Articles/231582/Auto-detect-CSV-separator .
Также вы можете выполнить некоторые тесты для своего экспортера, изменив значение «разделитель списков» в Windows следующим образом (может отличаться для каждой ОС Windows):
Свойство CurrencyDecimalSeparator содержит десятичный разделитель для данной культуры. При этом разделитель CSV не зависит от культуры. Это свойство файла CSV, которое вы указываете синтаксическому анализатору. И говоря о парсерах, я искренне надеюсь, что вы не сворачиваете свой собственный синтаксический анализатор CSV .
Как уже упоминалось, CSV вообще должен быть разделен запятой, а поля должны быть двойными. Однако существует также специфическое поведение MS Excel, которое приводит к неправильному импортированию правильного файла CSV. Это связано с тем, что по умолчанию MS Excel использует разделитель списков в Windows System в разделе «Региональные и языковые параметры». Для локали США / Великобритании это запятая, но для таких языков, как немецкий, это точка с запятой. Таким образом, для MS Excel опция заключается в использовании разных разделителей для каждой локали.
Как уже рекомендовали другие, формат не должен быть чувствительным к локали. Это справедливо для хранения (в таких файлах, как CSV или другие форматы) или протоколов связи. Вы должны беспокоиться о чувствительности локали только к слою презентации. В противном случае это означает, что файл, сохраненный американским пользователем (например), не может быть загружен немецким (и наоборот).
Подробнее см. Здесь: http: / /mihai-nita.net/2005/10/25/data-internationalization/