G>3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.
Этак можно и NullReferenceException бросать, работать-то будет. Нет, если ты выкладываешь код с пространством имён Microsoft, то надо соблюдать соглашения о кодировании Microsoft. Тут похоже, что автор "угадал" назначение NotSupportedException по названию, вместо того, чтобы заглянуть в документацию. А это неправильно.
G>Остается только GetColumnName не надо вызывать в каждой ветке, можно вызвать до if. Скорее всего тупо копипаста, в целом неопасная, так как ни вызов GetColumnName, ни его содержимое меняться не будет.
Здравствуйте, yenik, Вы писали:
G>>3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.
Y>Этак можно и NullReferenceException бросать, работать-то будет.
Нельзя. NRE это runtime exeption, а не usage. Человек, увидев NRE, не поймет что произошло.
G>>>3) Тип эксепшена не тот — это не имеет значения на самом деле. Это usage\design exeptions, их не надо ловить. Достаточно чтобы эксепшен сказал что с кодом не так.
Y>>Этак можно и NullReferenceException бросать, работать-то будет. G>Нельзя. NRE это runtime exeption, а не usage. Человек, увидев NRE, не поймет что произошло.
Значит, тип имеет значение. И надо следовать соглашениям.
Y>>Нет, если ты выкладываешь код с пространством имён Microsoft, то надо соблюдать соглашения о кодировании Microsoft. Тут похоже, что автор "угадал" назначение NotSupportedException по названию, вместо того, чтобы заглянуть в документацию. А это неправильно. G>Может они stack overflow читали https://stackoverflow.com/questions/12669805/when-to-use-invalidoperationexception-or-notsupportedexception
Даже там не сказано делать, как сделал Прашантх Говиндраджан.
Здравствуйте, yenik, Вы писали:
J>>Посмотрел по внимательнее, а он вообще что нить кроме typeof(string) вернуть может? Чё то как то совсем плохо
Y>А переменная nbline — что она считает? Если номер строки, то для разных колонок получится разный номер строки.
Ну в принципе да, номер значащей строки. Для них важно определить первая это значащая строка или нет. По мне все это должно выглядеть примерно так: (+/- опечатки, пишу без IDE)
private static Type GuessKind(int col, List<string[]> read)
{
Type previousType = null;
foreach (var line in read)
{
if (col >= line.Length)
throw new FormatException(string.Format(Strings.LessColumnsThatExpected, nbline + 1));
string val = line[col];
if (string.IsNullOrEmpty(val) || string.Equals(val, "null", StringComparison.OrdinalIgnoreCase))
{
continue;
}
var suggestType = bool.TryParse(val, out _) ? typeof(bool)
: float.TryParse(val, out _) ? typeof(float)
: DateTime.TryParse(val, out _) ? typeof(DateTime)
: typeof(string);
if (previousType == null)
{
previousType = suggestType;
}
if (previousType != suggestType || suggestType == typeof(string))
{
return typeof(string);
}
}
return previousType ?? typeof(string);
}
Но на самом деле — самое страшное, что у них походу нету тестов. Ибо простейший тест бы показал, что типы колонок неверно определяются.
K>Ну так вы и не понимаете именно в силу вот таких new NotSupportedException!! K>Ошибки всегда надо сопровождать локльным контекстом и/или кратким адекватным комментом — "при создании колонки использован неизвестный тип ДаОткудаТыВзялсяТварь".
Я как понял, то устроили порку библиотечному коду.
Так, вот, все исключения типа: NotSupportedException, ArgumentException и тд. — это исключения, возникающие из-за нарушения контракта.
В отлаженном и хорошо написанном пользовательском продукте, использующим данную библиотеку, все эти исключения не должны возникнуть.
Так, что пользователь не должен увидить библиотечные исключения. Так, что throw new ArgumentNullException(nameof({myParameter})) — это норм для библиотечного кода
А если будет 10000 разных типов? По крайней мере switch-case оптимизируется до выбора по таблице.
Но почему бы kind не свести к индексу в таблице сразу и не выбрать. Ну или мапу построить,
всяко O(log(N)) сильно лучше, чем O(N). Но O(1) вообще же лучше (выбор из таблицы). Я понимаю,
что до трёх десятков элементов это не сильно принципиально... Но вот Ctrl-C/Ctrl-V по всему коду
одно и то же 100500 раз подряд. Почему один раз в переменную не сохранить, а потом её везде
не подставить. Это какой-то треш.
И наконец зачем 100500 вариантов руками расписывать для каждого типа, если там реализация
отличается только типом. Int16DataFrameColumn.cs, Int32DataFrameColumn.cs -- это ж обезьяна
какая-то писала. Ну вот я бы шаблон какой-то бы придумал, чтоб функций само нагенерило,
а не через Ctrl-C/Ctrl-V (потому, что потом если где-то ошибка например, то её теперь
по всем 100500 файлам выискивать и править? а если интерфейс поменять -- проще повеситься).
Я в C# вообще не силён, но по аналогии с C++... А в голом C бы руками сделал какую-то
обобщённую функцию, которая с почти любым типом умеет работать (ну может ей бы ширина
типа передавалась, например).
Здравствуйте, fk0, Вы писали:
fk0>Int16DataFrameColumn.cs, Int32DataFrameColumn.cs -- это ж обезьяна fk0>какая-то писала. Ну вот я бы шаблон какой-то бы придумал, чтоб функций само нагенерило, fk0>а не через Ctrl-C/Ctrl-V (потому, что потом если где-то ошибка например, то её теперь fk0>по всем 100500 файлам выискивать и править? а если интерфейс поменять -- проще повеситься).
Скорее всего, одного генерика там бы за глаза хватило. Но это уже высший пилотаж.