Неявный вопрос производительности VB

Иногда мне приходится реализовывать интерфейс или наследовать виртуальный объект (MustInherit), в котором базовый метод ожидает объект, хотя я знаю, что значение, которое я передам, всегда будет, например, целым числом.

Какой должна быть лучшая производительность из приведенных ниже примеров:

Public Sub DoSomething(ByVal obj As Object)
    'option 1:
    Dim x As Integer = obj

    'option 2:
    Dim y = DirectCast(obj, Integer)
End Function

Соображения:

  • Вариант 1. Нет литья, но, может быть, это не так правильно, стоит ли это меньше производительности?
  • Вариант 2. Кастинг, когда тип известен, но чувствует себя более безопасно.

Примечание. Пожалуйста, не комментируйте: "Почему бы вам не реализовать это по-другому?" И т. Д. И т. Д. У меня вопрос не в том, как это сделать, я не нашел пример того, как это задать, мой вопрос. это только то, что вариант должен быть прав, и что будет стоить больше производительности.

2 ответа

Решение

Ваш Вариант 1 все еще находится в кастинге - фактически, он делает больше, чем он, он выполняет конвертацию. Например, если obj - это строка "1", вариант 1 преобразует ее в целое число 1, тогда как вариант 2 завершится с ошибкой InvalidCastException. (В старые добрые времена это было известно как "принуждение к злому типу", которое звучит намного круче, чем неявное преобразование, но также подчеркивает потенциальную опасность того, что этот подход может скрыть ошибки и привести к непредвиденному поведению.)

Поэтому вариант 1, вероятно, будет немного менее производительным, потому что он выполняет немного больше работы (преобразование в отличие от простого старого приведения). Но разница, вероятно, будет незначительной, если вы когда-либо передаете только целые числа. Как всегда, если производительность действительно имеет значение, измерьте.

Вероятно, более важным фактором, чем перфект, является желаемое поведение. Например, если кто-то передает строку "1", хотите ли вы, чтобы она работала так, как если бы они передали целое число 1? Если это так, перейдите к варианту 1. Если вы хотите, чтобы в этом случае произошел сбой, перейдите к варианту 2.

То, что вы делаете в первом варианте, является неявным приведением. Компилятор создает явное приведение для вас, так что то, что вы на самом деле получаете, по-прежнему похоже на:

Dim x As Integer = DirectCast(obj, Integer)

Вы можете выполнять неявное приведение от объекта к целому, только когда строгий режим отключен. Вам следует включить строгий режим, чтобы быть уверенным, что вы не выполните неявное приведение по ошибке. Когда вы включили строгий режим, вам придется выполнить явное приведение кода для компиляции.

Другие вопросы по тегам