(строка) читатель [0] по сравнению с Преобразованием. ToString (читатель [0])

что лучше

var s =  (string)reader[0]  

или

var s = Convert.ToString(reader[0])

?

7
задан Omu 15 February 2010 в 14:09
поделиться

9 ответов

Я бы сказал reader.GetString (0)

7
ответ дан 6 December 2019 в 07:06
поделиться
var s =  (string)reader[0]  

выдаст исключение при приведении класса, если его нельзя преобразовать как строку, тогда как

var s = Convert.ToString(reader[0])

будет обрабатывать его более изящно, и вы получите null, если он не может быть преобразован. Это также будет обрабатывать больше типов объектов для reader [0], поскольку другой метод будет разрешать только приведение типов, в которых тип может быть приведен к строке, тогда как он будет поддерживать любой тип, который может обрабатывать класс Convert. Что, я полагаю, больше. Но может и не быть ...

2
ответ дан 6 December 2019 в 07:06
поделиться

Как насчет reader.GetString (0); ?

2
ответ дан 6 December 2019 в 07:06
поделиться

как насчет

reader [0] .ToString ();

1
ответ дан 6 December 2019 в 07:06
поделиться

Я бы выбрал

reader[0].ToString();
0
ответ дан 6 December 2019 в 07:06
поделиться
// Conveys that you are sure that reader[0] is a string and 
// if it's not you probably have bigger problems 
// than the resulting exception
var s =  (string)reader[0];

// Conveys that you are hoping that reader[0] is convertible to a string
var s = Convert.ToString(reader[0])

Так что, вероятно, это вопрос выбора с учетом контекста.

4
ответ дан 6 December 2019 в 07:06
поделиться

Это быстрее, примерно ~ 30% быстрее в моем тестировании:

var s =  (string)reader[0];

Это, однако, не взорвется, если оно равно нулю:

var s = Convert.ToString(reader[0]);
2
ответ дан 6 December 2019 в 07:06
поделиться

В «многоуровневой» архитектуре (очень распространенный сценарий) самый глубокий лживый компонент отвечает за предусматривать политики по этому вопросу (может возвращать shared _ ptr < > , как предложено выше, или "вызывающий абонент несет ответственность за удаление этого" или "никогда не удалять это, но вызвать releaseFooObject() при выполнении и отсутствии доступа к нему после "или...), и компонент ближе к пользователю отвечает за соблюдение этой политики.

Двунаправленный информационный поток усложняет описание обязанностей.


ограничивается ли эта проблема только библиотеками DLL или же общие объекты UNIX тоже «причиняются»?

На самом деле это хуже, чем это: вы можете иметь эту проблему так же легко со статически связанными библиотеками. Именно существование границ кода внутри одного контекста выполнения создает возможность неправильного использования или неправильного сообщения о каком-либо объекте.

-121--2145729-

Я бы предположил reader [0] .ToString ();

-121--3791938-

Если reader [0] на самом деле является последовательностью, то (последовательности) reader [0] .

Это более ясно и, скорее всего, быстрее (если компилятор не делает некоторую магическую оптимизацию, о которой я не знаю).

2
ответ дан 6 December 2019 в 07:06
поделиться

Думаю, reader [0] .ToString ();

1
ответ дан 6 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

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