Подтвердить что ты не робот

Что означает [param: NotNull] в С#?

В исходном коде Framework Entity Framework (ссылка) Я нашел эту строку:

public virtual IRelationalTransaction Transaction 
{ get; [param: NotNull] protected set; }

Часть [param: NotNull] выглядит очень странно для меня. Любая идея, что такое синтаксис С#? Я знаком с атрибутами и параметром, но не с этой комбинацией.

Определение NotNull заключается в следующем:

[AttributeUsage(
    AttributeTargets.Method | AttributeTargets.Parameter |
    AttributeTargets.Property | AttributeTargets.Delegate |
    AttributeTargets.Field)]
internal sealed class NotNullAttribute : Attribute
{
}

Что я ожидал использовать просто как [NotNull], но что здесь делает param?

4b9b3361

Ответ 1

Когда вы отмечаете метод с NotNull, это означает, что этот метод возвращает не нулевой объект:

[NotNull]
public object Get()
{
    return null; //error
}

Когда вы отмечаете setter, он делает то же самое - setter возвращает не null (потому что .net преобразует свойства для получения и установки методов).

public virtual IRelationalTransaction Transaction { get; [NotNull] protected set; }

Равенство:

[NotNull] 
public virtual void set_Transaction(IRelationalTransaction value) { ... }

Итак, вам нужно добавить param: в точку, что "i mean - параметр setter не является нулевым, а не результатом set-method":

public virtual IRelationalTransaction Transaction { get; [param: NotNull] protected set; }

Равенство:

public virtual void set_Transaction([NotNull] IRelationalTransaction value) { ... }

Ответ 2

param: является целью атрибута. Смотрите: Спецификация атрибута

Атрибут target может быть одним из следующих:

assembly, module, field, event, method, param, property, return, type

Таким образом, [param: NotNull] означает, что NotNullAttribute применяется к параметру value установщика. Здесь необходимо указать цель, поскольку параметр value явно не отображается в качестве параметра метода.


Обычно атрибут-цель используется для указания InternalsVisibleToAttribute, чтобы типы и члены, объявленные как internal, были видимы для проектов модульного тестирования.

[assembly:InternalsVisibleTo("UnitTestProject")]

Сборка не отображается как языковая конструкция, поэтому атрибут-цель assembly - единственный способ указать атрибут для сборки. Кстати: это может быть указано в любом файле исходного кода.