如果不在方法本身中放入我自己的异常,我将如何指定我的方法的特定参数不可为空?
是否有类似的东西,
public void Foo (String myRequiredString nullable){
}
答案 0 :(得分:3)
有人要求在语言中包含一些内容以帮助(基本上对你进行空检查),但它没有发生。类似的东西:
public void Foo (string! myRequiredString nullable) {...}
答案 1 :(得分:1)
没有内置任何内容,但您可以查看“按合同设计”的概念,如(例如)LinFu中所实现。
答案 2 :(得分:1)
在C#4.0中,您可以使用代码合同:InfoQ: .NET 4 Feature Focus: Code Contracts。
目前所有其他解决方案都涉及运行时代码检查。您可以使用AOP框架(如PostSharp)将代码注入到方法中,但这一切都归结为方法中的代码。
答案 3 :(得分:1)
除了进入.NET的一些测试版之外......虽然令人兴奋,但风险很大,并没有真正回答你的问题。
现在不幸的是,您可以做的最好的事情是在您的代码中添加Intellisense注释,警告不要传递空值。
/// <summary>
/// This Foo method does Bar to something.
/// </summary>
/// <param name="myRequiredString">required, do NOT pass nulls. I really really mean it!</param>
public void Foo(String myRequiredString)
{
if (myRequiredString == null)
{
throw new ArgumentNullException("myRequiredString", "It said required in the name of the argument, dummy!");
}
}
有一些hackish solutions,其中人们已经实现了一个通用的NonNullable结构,但是你想要的底线就是让Visual Studio不要输入“Foo(null)”并警告如果你这样做或给你一些编译器错误,事实是99.99%的方法调用,其中某些东西不应该是可空的,你将不得不进行== null检查并抛出一个ArgumentNullException,因为你不知道参数在运行时是否为空。即使你在C#中找到了什么,至少编译器必须添加null检查并在那里抛出ArgumentNullException。
我想我说的是你正在寻找的是“语法糖”来保存你的手指一些动作。目前,如果您厌倦了键入,我建议您创建一个代码段。
答案 4 :(得分:0)
我目前正在C#中研究这个主题。 .NET具有Nullable&lt; T&gt;对于值类型,但引用类型不存在反向特征。
我创建了NotNullable&lt; T&gt;对于引用类型,并将问题从if(不再检查null)移动到数据类型域。但是,这使应用程序在运行时而不是在编译时抛出异常,但它对我来说仍然非常有用。