[param:NotNull]在C#中的含义是什么?

时间:2015-09-11 16:32:43

标签: c#

在Entity Framework的源代码(link)中,我发现了这一行:

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

[param: NotNull]部分对我来说很奇怪。知道这是什么样的C#语法吗?我熟悉属性和参数,但不熟悉这种组合。

NotNull的定义是:

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

我希望将其简单地用作[NotNull],但param在这里做什么?

2 个答案:

答案 0 :(得分:58)

当您使用NotNull标记方法时,该方法返回的不是null对象:

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

当你标记setter时它会做同样的事情 - setter返回非null(因为.net将属性转换为get和set方法)。

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

等于:

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

所以,你需要添加param:指向,即#34;我的意思是 - setter的参数不为null,不是set-method的结果":

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

等于:

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

答案 1 :(得分:39)

param:是属性目标。请参阅:17.2 Attribute specification

属性目标可以是以下之一:

  

程序集,模块,字段,事件,方法,参数,属性,返回,类型

因此[param: NotNull]表示NotNullAttribute适用于setter的value参数。由于value参数未显式显示为方法参数,因此必须在此处指定目标。

属性 - 目标的一个常见用途是指定InternalsVisibleToAttribute,以使声明为internal的类型和成员对单元测试项目可见。

[assembly:InternalsVisibleTo("UnitTestProject")]

程序集不会显示为语言构造,因此属性目标assembly是指定程序集属性的唯一方法。顺便说一句:它可以在任何源代码文件中指定。