在C#中是什么意思?

在entity framework的源代码( 链接 ),我发现这一行:

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]但是在这里做什么呢?

当用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:指出,“我的意思是 – setter的参数不是null,不是set-method的结果”:

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

等于:

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

param:属性目标。 参见: 17.2属性说明

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

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

所以[param: NotNull]意味着NotNullAttribute适用于setter的value参数。 这里有必要指定目标,因为value参数不会显式地作为方法参数出现。


属性目标的常见用法是指定InternalsVisibleToAttribute ,以使types和成员声明为internal对unit testing项目可见。

 [assembly:InternalsVisibleTo("UnitTestProject")] 

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