在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
是指定程序集属性的唯一方法。 顺便说一句:它可以在任何源代码文件中指定。