Порядок атрибутов в дизассемблированном коде


При проверке дизассемблированного кода, который был экспортирован с помощью .NET Reflector, я заметил, что порядок атрибутов на любой заданной сущности не всегда поддерживается.

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

Например

[WebBrowsable, Personalizable]
public int SomeProperty ...

Vs

[Personalizable, WebBrowsable]
public int SomeProperty ...

Это довольно неудобно, поскольку это заставляет его выглядеть так, как будто файлы, которые не изменились, изменились.

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

2 3

2 ответа:

Согласно спецификации

Порядок, в котором атрибуты задаются в таком списке, и порядок, в котором располагаются разделы, присоединенные к одному и тому же объекту программы, не имеет значения. Например, спецификации атрибутов [A][B], [B][A], [A, B] и [B, A] эквивалентны.

Это не совсем говорит о том, что ничего нельзя сделать для поддержания порядка, но это говорит о том, что компилятор не должен обращать внимание на порядок атрибуты и таким образом свободен переупорядочить, как он считает нужным. Если вы хотите гарантировать заказ, вам, вероятно, придется изменить сборку после сборки. Возможно, есть более простой способ решить вашу проблему.

Порядок атрибутов не влияет на семантику кода, а является просто артефактом того, как компилятор C# компилирует проект. вероятно, это хаотичное эмерджентное поведение в зависимости от того, что еще есть в вашем проекте. К сожалению, вы мало что можете с этим поделать...