Почему преобразования.ToInt32(типа int32) существует?

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

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

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

5 ответов


мои мысли:

  • для генерации кода: особенно в .NET 2.0 было создано много кода, например, типизированных наборов данных. Имея перегрузку, как Convert.ToInt32(Int32) упрощает генератор кода, но не препятствует производительности во время выполнения, так как вызов, вероятно, JITed прочь немедленно
  • для последовательности: существует интерфейс IConvertible в .NET с 2.0 или, возможно, даже с 1.0, который используется преобразователем класс. Этот интерфейс требует таких методов, как ToInt32 и т. д.

генерация кода (Подробнее): Обычным методом генерации кода в .NET 2.0 раз была System.CodeDOM, поскольку он предоставляет средства для повторного использования одного и того же генератора кода для нескольких языков, наиболее заметно VB.NET и C#. В CodeDOM вам не нужно знать, какого типа данное выражение должно вызывать метод, вы можете просто создать CodeMethodCallExpression, заданное в выражении целевого объекта и имя метода. С другой стороны, многие операторы cast, такие как C#S as оператор не поддерживается CodeDOM.

как следствие, часто трудно узнать тип данного выражения кода в CodeDOM. Это имеет смысл, поскольку многие методы, которые могут включать выражение, также являются частью сгенерированного кода и, следовательно, неизвестны во время генерации. Однако в некоторых случаях требуется определенное выражение, преобразованное в данный тип, например System.Int32. Могу себе представить. это действительно произошло для типизированных наборов данных, хотя я не уверен на 100%. Потому что Convert.ToInt32 существует, генератору не нужно знать, имеет ли данное выражение тип System.Int32 или нет. Когда компилятор компилирует сгенерированный код, все сигнатуры методов доступны, и компилятор может выяснить, что тип выражения System.Int32 и вызовите соответствующую перегрузку.

С другой стороны, компилятор JIT обнаружит, что метод Convert.ToInt32 просто вернет свой аргумент. Но поскольку метод не является виртуальным, тело методов может быть вставлено в код вызывающих абонентов вместо вызова Convert.ToInt32 поскольку накладные расходы на вызов метода будут намного выше, чем тело метода.


только дизайнеры API знают.

Если бы мне пришлось сделать предположение, я бы предположил, что это ради согласованности - например, когда вы используете отражение для динамического создания вызовов, проще, если вы можете сделать предположение, что каждый Convert.ToX(Y) комбинация существует для любых примитивных типов X и Y.


мы можем получить один возможный ответ из использования ToInt32 (Int32) в классах framework.

Е. Г. Система.Деятельности.DurableInstancing.SerializationUtilities

public static byte[] CreateKeyBinaryBlob(List<CorrelationKey>correlationKeys)
{
     [...]
     Convert.ToInt32(correlationKey.BinaryData.Count)

и Система.ComponentModel.Дизайн.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, но есть разумное ожидание, что /возможно / этот тип может отличаться на разных платформах, архитектурах ЦП, будущих версий платформы и т. д.

таким образом, мой предлагаемый ответ заключается в том, что он существует как своего рода будущая проверка исходного кода, чтобы позволить ему компилироваться без изменений, даже когда некоторые ключевые "сущности" (такие как window X и y coords) изменяют тип.


Общеязыковая среда выполнения используйте внутренне интерфейс IConvertible. Поскольку базовыми типами среды CLR являются Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, Char y String, для каждого из них есть реализация в классе Convert.

но, например, преобразовать.Toboolean (DateTime) всегда возвращает исключение по дизайну.


Вот описание метода:

    //
    // 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).