Эта DLL управляемая или неуправляемая?

Я не согласен с другими утверждениями ответов

... это не гарантируется ...

... вы не можете полагаться на этом ...

blockquote>

, а также с утверждением msdn:

... ваш код приложения никогда не должен зависеть от метода, возвращающего имя определенного члена ...

blockquote>

История

В моем программном обеспечении

enum Blabla { A = 0, B = 1, C = 2, D = 3 }

было перечислено значение AAA, значение которого изменяется на AA, а затем AA изменяется на AAA. Чтобы сохранить обратную совместимость, мне пришлось делать

enum Blabla { A = 0, AA = 0, AAA = 0, B = 1, C = 2, D = 3 }

. Это позволяет десериализовать значение старого enum (сделанное более старыми версиями программного обеспечения) как AAA.

Затем был отчет который печатает значение Blabla. И в какой-то момент каждый клиент, использующий новую версию, начинает рассказывать мне, что вместо AAA они видят значение AA. Все они видят AA (и никто из них не видит A).

Что я сделал? Я просто изменяю порядок (пока результат не был AAA)

enum Blabla { AAA = 0, A = 0, AA = 0, ...}

и сделал тест, чтобы убедиться, что Blabla.AAA будет выводиться как AAA. Проблема решена?

Доказательство

Глядя на источники Enum.ToString() (или Enum.GetName()), он использует GetEnumName () , который вызывает Array.BinarySearch() для отсортированного массива значений, чтобы найти индекс значения.

Результатом двоичного поиска является детерминированный : при условии, что он с теми же параметрами вернет тот же результат.

Итак:

  • , если вы не изменяете enum, тогда результат будет таким же.
  • можно найти результат экспериментально (или, возможно, понимая, как бинарный поиск работает и как будет обрабатываться enum).
  • нет простого правила для определения результата (например, вы не можете сказать, что он всегда возвращает первое определенное значение »).
  • маловероятно, что формат enum будет изменен (например, порядок определения и порядок перечня значений отличается) или Enum.ToString() будет изменен, однако это может произойти, поэтому убедитесь, что у вас есть тесты для случаи, когда вы полагаетесь на возвращаемое значение.

16
задан starblue 12 March 2011 в 20:28
поделиться