C#指定方法参数不可为空

时间:2009-07-17 12:33:49

标签: c#

如果不在方法本身中放入我自己的异常,我将如何指定我的方法的特定参数不可为空?

是否有类似的东西,

public void Foo (String myRequiredString nullable){

}

5 个答案:

答案 0 :(得分:3)

基本上,你不能。你也许可以使用AOP(例如PostSharp)通过属性或4.0中的代码契约(允许编译时检查)为你做一些事情;但是没有“不可空的引用类型”(比较“可空值类型”等)。尤其是:字段初始化为什么?什么会默认(...)?

有人要求在语言中包含一些内容以帮助(基本上对你进行空检查),但它没有发生。类似的东西:

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)移动到数据类型域。但是,这使应用程序在运行时而不是在编译时抛出异常,但它对我来说仍然非常有用。