Разница между приведением и преобразованием в C # - PullRequest
4 голосов
/ 20 декабря 2010

У меня есть SQL-накопитель данных ... Из которого мне нужно получить одно десятичное значение.

В чем разница между

  1. (десятичное) DataReader [ "процент"] * * 1 006

и

  1. Convert.Todecimal (DataReader [ "процент"])

А что такое prons и cos .... обоих методов.

Ответы [ 5 ]

11 голосов
/ 20 декабря 2010

Приведение будет успешным, только если объект, возвращаемый datareader["percent"], имеет тип Decimal. Преобразование будет успешным, когда объект любого типа будет преобразован в Decimal. Это включает int, long, short и т. Д. Или, в более общем случае, все, что реализует IConvertible и возвращает полезное значение из IConvertible.ToDecimal(), может быть передано Convert.ToDecimal().

Например:

csharp> object a = (int)1;

csharp> a.GetType();
System.Int32

csharp> var dec = (decimal)a;
System.InvalidCastException: Cannot cast from source type to destination type.
  at Class3.Host (System.Object& $retval) [0x00000] in <filename unknown>:0
  at Mono.CSharp.Evaluator.Evaluate (System.String input, System.Object& result, System.Boolean& result_set) [0x00000] in <filename unknown>:0
  at Mono.CSharpShell.Evaluate (System.String input) [0x00000] in <filename unknown>:0

csharp> var dec = Convert.ToDecimal(a);

csharp> dec;
1

csharp> dec.GetType();
System.Decimal
3 голосов
/ 20 декабря 2010

Я не знаю конкретно о десятичной системе, но я знаю, что для целых чисел конвертировать раунды, тогда как приведение усечений, т. Е. (Int) 7.6 - 7, Convert.ToInt32 (7.6) - 8. Неприменимо для вашего примера, но хорошо иметь в виду.

0 голосов
/ 20 декабря 2010

Здесь есть несколько хороших ответов, но, поскольку вы упомянули SqlDataReader, вы используете метод GetDecimal () вместо использования синтаксиса синтаксиса reader ["columnName"]. Я не знаю, купит ли он вам какую-либо производительность, но он дает вам безопасность типов без использования Convert или casting.

0 голосов
/ 20 декабря 2010

Первый ((decimal)datareader["percent"]) - явное преобразование (приведение). Он заставляет компилятор распаковать или привести целевое значение (datareader["percent"]) к decimal. Это вызовет InvalidCastException, если datareader["percent"] не является decimal или в штучной упаковке decimal.

Второй выполняет код, являющийся частью .NET, который проверяет, что это за объект datareader["percent"], и пытается преобразовать его в decimal соответствующим образом. Это будет успешным, если значением является любое число (например, int).

0 голосов
/ 20 декабря 2010

EDIT

Кастинг говорит, что объект имеет тип (или производную). Конверт говорит, что, хотя это может быть не тот тип или производная, существует способ обращения к типу назначения.

, например

string a = "1234";
object b = a;

// success, a is really a string
string c = (string)b;

// fails because b is not actually an int
int d = (int)b;

// success because there is way to convert the numeric string to an int
int e = Convert.ToInt32(b);

РЕДАКТИРОВАТЬ: Хорошая точка @cdhowie, скольжение Фрейда. Это должно быть немного более информативным

...