Как ядро ​​dot net обрабатывает Arg.NotNull и Contract.Requires - PullRequest
0 голосов
/ 18 февраля 2019

В aspnet-api-versioning я обнаружил кодовый блок:

DefaultApiControllerFilter( IEnumerable<IApiControllerSpecification> pecifications )
        {
            Arg.NotNull( specifications, nameof( specifications ) );
            this.specifications = specifications.ToArray();
        }

Интересующий блок Arg.NotNull( value, "text" ); из пространства имен Microsoft.

И в коде есть несколько похожих утверждений.Другой пример - Contract.Requires() из System.Diagnostics.Contracts

Попытка поиска в документах Microsoft о принципах работы, но не нашла информацию.

Так что, возможно, может помочь выяснить, как это работает:как postsharp переписать код, предоставить условную проверку во время выполнения как Debug.Assert или, может быть, просто выдает исключения (но это не упоминается в документации)?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

После загрузки исходных кодов библиотеки скомпилируйте и просмотрите скомпилированный код, который обнаружил, что Microsoft::Arg - это просто проект с общим кодом с методом

internal static void NotNull<T>(T value, string name) where T : class 
    {
      if ((object) value == null)    throw new ArgumentNullException(name);
    }

и Contract.Requires(condition)является Кодовым Контрактом Расширением генерации кода Assert, которое ... не производит никакого кода из-за отсутствия события assert post build. Аналогичное наложение в стеке Powerflow .

0 голосов
/ 18 февраля 2019

Это кодовые контракты (см. https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/code-contracts и https://www.microsoft.com/en-us/research/project/code-contracts/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fprojects%2Fcontracts%2Fuserdoc.pdf)

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

...