Подтвердить что ты не робот

Почему Convert.ToInt32 (Int32) существует?

Существует перегрузка Convert.ToInt32, которая принимает Int32 в качестве параметра. Но даже документация говорит, что в принципе ничего не происходит, и метод возвращает свой ввод.

Вопрос в том, почему у нас такая перегрузка? Есть ли в этом цель? Может ли кто-нибудь дать мне пример использования этого метода?

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

4b9b3361

Ответ 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).