在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; }
你去了,否则只是定义其他的声明。