разница между (int) и convert.toint32 в c # - PullRequest
2 голосов
/ 17 июня 2010

когда я конвертирую объект в int с помощью

(int)object

, тогда когда значение объекта равно 0, он выдает мне ошибку, что конкретное приведение неверно.

когда я конвертирую объект вint by

convert.toint32(object)

тогда он работает и дает мне 0 означает, что приведение действительное.

и я хочу знать, в чем разница между обоими.

1. (int)object
2.convert.toint32(object)

Ответы [ 5 ]

12 голосов
/ 17 июня 2010

(int) работает только , если объект на самом деле является целым числом. Например, (int) "12" выдаст вам недопустимое исключение приведения.

Convert.ToInt32 старается преобразовать все, что вы даете, в целое число. Так Convert.ToInt32("12") вернет 12. Если быть точным, если объект реализует IConvertible (что делает System.String), то Convert.ToInt32 вызовет IConvertible.ToInt32 метод.

3 голосов
/ 17 июня 2010

В общем смысле, (Type)val может представлять:

  • встроенное преобразование (например, между float и int), определяемое языком
    • , что может потребовать фактической операции (хороший пример - float <===> int)
    • или может быть просто для работы компилятора (например, int <===> an-int-enum)
  • приведение ссылки (которое никогда не изменяет ссылку или объект; оно просто набирает для него локальный дескриптор)
    • , которая может потребовать проверки типа (например, object ===> IDataReader)
    • но уже может быть известно, что оно истинно (например, IDataReader ===> object)
  • операция упаковки / распаковки (которая всегда инициализирует тип значения или создает новый объект в куче [за исключением нулевого бокса Nullable<T>]
  • оператор преобразования определенного типа (неявный или явный), который запускает любой код, определенный в типе

Учитывая значение object, (int)object будет предполагать, что это операция распаковки , поэтому будет работать, только если объект имеет значение в штучной упаковке int (или в штучной упаковке Int-enum). Это не удастся, если значение объекта на самом деле является строкой или в штучной упаковке - float и т. Д.

Convert.ToInt32 работает иначе; он запускает ряд тестов, чтобы попытаться собрать воедино такие вещи, как приведение типа с плавающей точкой (описано выше) и разбор строки (которая отображается на int.Parse).

3 голосов
/ 17 июня 2010

Оба метода совершенно разные. Первый - casting, а второй - conversion.

Conversion используется, когда значение non-integer необходимо преобразовать в int.

Casting используется для unbox возврата экземпляра к int, когда экземпляр уже имеет тип int, заключенный в тип Object.

2 голосов
/ 17 июня 2010

Есть два сценария, где (int) something работает:

  1. something - это int, который был помещен в объект, и мы используем вызов для его распаковки. Это то, что происходит, если вы помещаете int в ArrayList, или в HttpSession и т. Д. *

  2. something не является int, но его тип может быть явно преобразован в int, например, short, long, float встроенных типов или тип который реализовал явный оператор приведения.

Convert.ToInt32, с другой стороны, просто вызывает метод something типа IConvertible.ToInt32, и он более или менее эквивалентен int.Parse(something)

1 голос
/ 17 июня 2010

Существует много способов преобразования в int, многое зависит от того, какой у вас источник.

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

Приведение с (int), Преобразование с Convert.ToInt32 (), Синтаксический анализ с int.Parse () могут генерировать исключения, такие как InvalidCastException, FormatException и OverflowException, и должны использовать try / catch для обработки неудачного результата.

Синтаксический анализ с помощью int.TryParse () вернет результат истина / ложь, если разбор был успешным, а в случае успеха установите значение параметра out, указанного в вызове функции.

Если вы действительно пытаетесь взять какой-либо объект и превратить его в int, то вам лучше всего использовать Convert.ToInt32, например:

public void TestFunction(object input)
  try {
    int value = Convert.ToInt32(input);
    SomeOtherFunction(value);
  }
  catch (Exception ex) {
    Console.WriteLine("Could not determine integer value");
  }
}

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

public void TestFunction(object input)
  try {
    int value = int.Parse(input.ToString());
    SomeOtherFunction(value);
  }
  catch (Exception ex) {
    Console.WriteLine("Could not determine integer value");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...