在C#/。NET中将参数标记为不可空?

是否有一个简单的属性或数据约定,我可以分配给一个函数参数,防止null在C#/。NET中传递? 理想情况下,这也将在编译时检查,以确保文字null没有被用在任何地方,并在运行时抛出ArgumentNullException

目前我写了类似…

 if (null == arg) throw new ArgumentNullException("arg"); 

…对于每一个我希望不为null论证。

在同样的说明中,是否存在Nullable<>的反义词,从而导致以下失败:

 NonNullable<string> s = null; // throw some kind of exception 

不幸的是,在编译时没有任何东西可用。

我最近在博客上发布了一个黑客解决scheme ,它使用了一个新的结构和转换。

在.NET 4.0中使用代码合同的东西,生活会好很多。 实际的语言语法和对非可空性的支持仍然是相当不错的,但代码合同将会有很大的帮助。

我在MiscUtil中也有一个名为ThrowIfNull的扩展方法,这使得它更简单一些。

最后一点 – 使用“ if (null == arg) ”而不是“ if (arg == null) ”的任何原因? 我发现后者更容易阅读,前者在C中解决的问题不适用于C#。

我知道这是一个非常古老的问题,但是这里缺less这个问题:

如果你使用ReSharper,你可以使用Annotated Framework 。

查看企业库中的validation器。 你可以做一些事情:

 private MyType _someVariable = TenantType.None; [NotNullValidator(MessageTemplate = "Some Variable can not be empty")] public MyType SomeVariable { get { return _someVariable; } set { _someVariable = value; } } 

然后在你的代码中,当你想validation它:

 Microsoft.Practices.EnterpriseLibrary.Validation.Validator myValidator = ValidationFactory.CreateValidator<MyClass>(); ValidationResults vrInfo = InternalValidator.Validate(myObject); 

不是最漂亮的,而是:

 public static bool ContainsNullParameters(object[] methodParams) { return (from o in methodParams where o == null).Count() > 0; } 

您也可以在ContainsNullParameters方法中获得更多的创意:

 public static bool ContainsNullParameters(Dictionary<string, object> methodParams, out ArgumentNullException containsNullParameters) { var nullParams = from o in methodParams where o.Value == null select o; bool paramsNull = nullParams.Count() > 0; if (paramsNull) { StringBuilder sb = new StringBuilder(); foreach (var param in nullParams) sb.Append(param.Key + " is null. "); containsNullParameters = new ArgumentNullException(sb.ToString()); } else containsNullParameters = null; return paramsNull; } 

当然,你可以使用拦截器或reflection,但这些很容易跟随/使用,很less的开销

好的,这个答复有点晚了,但是我正在解决这个问题:

 public static string Default(this string x) { return x ?? ""; } 

使用这个extility方法,然后你可以把null和空string作为一样的东西。

例如

 if (model.Day.Default() == "") { //.. Do something to handle no Day .. } 

不理想我知道,你必须记得在任何地方调用默认,但它是一个解决scheme。

 public void foo(int? id, string name) { if (id == null) { throw new ArgumentNullException("id"); } if (name == null) { throw new ArgumentNullException("name"); } this.foo = id.Value; this.fooName = name; } 

你去了,否则只是定义其他的声明。