Что означает [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
?
Ответы
Ответ 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
- единственный способ указать атрибут для сборки. Кстати: это может быть указано в любом файле исходного кода.