Почему Convert.ToInt32 (Int32) существует?
Существует перегрузка Convert.ToInt32
, которая принимает Int32
в качестве параметра. Но даже документация говорит, что в принципе ничего не происходит, и метод возвращает свой ввод.
Вопрос в том, почему у нас такая перегрузка? Есть ли в этом цель? Может ли кто-нибудь дать мне пример использования этого метода?
Мои мысли. Я думаю, мы можем иметь это, потому что есть перегрузка, которая принимает объект. И таким образом мы хотим устранить бокс и так далее. Но я не уверен.
Ответы
Ответ 1
Мои идеи:
- Для генерации кода: особенно в .NET 2.0 много кода, например. были созданы типизированные наборы данных. Перегрузка, такая как
Convert.ToInt32(Int32)
, упрощает генератор кода, но не препятствует производительности во время выполнения, поскольку вызов, вероятно, немедленно удаляется.
- Для согласованности. В .NET есть интерфейс IConvertible с версии 2.0 или, возможно, даже с 1.0, который используется классом Convert. Этот интерфейс требует таких методов, как ToInt32 и т.д.
Генерация кода (подробнее):
Обычный способ генерации кода в .NET 2.0 раз был System.CodeDOM, поскольку он предоставляет средства для повторного использования одного и того же генератора кода для нескольких языков, в первую очередь VB.NET и С#. В CodeDOM вам не нужно знать, какой тип данного выражения должен вызывать метод, вы можете просто создать выражение CodeMethodCallExpression, указанное в выражении целевого объекта, и имя метода. С другой стороны, многие операторы литья, такие как С# s как оператор, не поддерживаются CodeDOM.
Как следствие, часто бывает сложно узнать тип данного кодового выражения в CodeDOM. Это полностью имеет смысл, поскольку многие методы, которые могут включать выражение, также являются частью сгенерированного кода и, таким образом, неизвестны во время генерации. Однако в некоторых случаях вам нужно определенное выражение, преобразованное в заданный тип, например System.Int32
. Я могу представить, что это действительно произошло для типизированных наборов данных, хотя я не уверен на 100%. Поскольку Convert.ToInt32
существует, генератору не нужно знать, имеет ли данное выражение тип System.Int32
или нет. Когда компилятор компилирует сгенерированный код, все сигнатуры методов доступны, и компилятор может выяснить, что тип выражения System.Int32
и вызвать соответствующую перегрузку.
С другой стороны, JIT-компилятор обнаружит, что метод Convert.ToInt32
просто вернет свой аргумент. Но поскольку метод не является виртуальным, тело методов может быть вставлено в код вызывающих абонентов вместо вызова Convert.ToInt32
, поскольку накладные расходы на вызов метода будут намного выше, чем тело метода.
Ответ 2
Только дизайнеры API знают.
Если бы я должен был предположить, я бы предположил, что это ради согласованности - например, когда вы используете отражение для динамического создания вызовов, проще, если вы можете сделать предположение, что каждая комбинация Convert.ToX(Y)
существует для любых примитивных типов X
и Y
.
Ответ 3
Мы можем получить один возможный ответ из способов использования ToInt32 (Int32) в рамках классов.
например.
System.Activities.DurableInstancing.SerializationUtilities
public static byte[] CreateKeyBinaryBlob(List<CorrelationKey>correlationKeys)
{
[...]
Convert.ToInt32(correlationKey.BinaryData.Count)
и
System.ComponentModel.Design.CollectionEditor
private void PaintArrow(Graphics g, Rectangle dropDownRect)
{
Point point = new Point(Convert.ToInt32(dropDownRect.Left + dropDownRect.Width / 2), Convert.ToInt32(dropDownRect.Top + dropDownRect.Height / 2));
В обоих случаях мы можем видеть, что тип свойства или выражение в настоящее время является Int32, но есть разумное ожидание того, что/возможно/этот тип может отличаться на разных платформах, архитектурах процессоров, будущих версиях фреймворка и т.д.
Итак, мой предложенный ответ заключается в том, что он существует как своего рода будущая коррекция исходного кода, чтобы он мог компилироваться без изменений, даже когда некоторые ключевые "сущности" (такие как окна X и Y-координаты) меняют тип.
Ответ 4
Common Language Runtime использует внутренний интерфейс IConvertible.
Поскольку базовыми типами CLR являются Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, Char y String, есть реализация для каждого из них в классе Convert.
Но, например, Convert.toBoolean(DateTime) всегда возвращает Исключение, по дизайну.
Ответ 5
Здесь описание метода:
//
// Summary:
// Returns the specified 32-bit signed integer; no actual conversion is performed.
//
// Parameters:
// value:
// The 32-bit signed integer to return.
//
// Returns:
// value is returned unchanged.
Единственное, о чем я могу думать, это то, что это ярлык/сквозной, если вход уже является int
. Вероятно, это намного эффективнее, чем если int
был передан в Convert.ToInt32(object)
.