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

C#指定方法参数不可为空,c#,C#,如果不在方法本身中加入我自己的异常,我将如何指定方法的特定参数不可为null 有没有类似的东西 public void Foo (String myRequiredString nullable){ } 没有内置内容,但您可以查看(例如)中实现的“契约式设计”概念。基本上不能。您也许可以使用AOP(例如)通过属性或4.0中的代码契约(允许编译时检查)来为您执行一些操作;但是没有“不可为null的引用类型”(与“可为null的值类型”等进行比较)。最重要的是:字段将初始化为什么?那么违约(…)

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

有没有类似的东西

public void Foo (String myRequiredString nullable){

}

没有内置内容,但您可以查看(例如)中实现的“契约式设计”概念。

基本上不能。您也许可以使用AOP(例如)通过属性或4.0中的代码契约(允许编译时检查)来为您执行一些操作;但是没有“不可为null的引用类型”(与“可为null的值类型”等进行比较)。最重要的是:字段将初始化为什么?那么违约(…)是什么呢

有人请求在langauge中包含一些帮助(基本上是为您执行空检查),但没有发生。比如:

public void Foo (string! myRequiredString nullable) {...}
在C#4.0中,您可以使用代码契约:


目前所有其他解决方案都涉及运行时代码检查。您可以使用AOP框架,比如将代码注入到方法中,但这一切都归结为方法中的代码。

除了进入.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!");
        }
    }
//
///这个Foo方法并不禁止某些东西。
/// 
///必需,不传递空值。我真的是认真的!
公共void Foo(字符串myRequiredString)
{
如果(myRequiredString==null)
{
抛出新的ArgumentNullException(“myRequiredString”,“它在参数名称中表示required,dummy!”);
}
}
有一些人已经实现了一个通用的不可为null的结构,但底线是Visual Studio不允许您键入“Foo(null)”并在您键入或给您一些编译器错误时向您发出警告,事实上99.99%的方法调用不应为null,您必须执行==null检查并抛出ArgumentNullException,因为直到运行时您才知道参数为null。即使存在您在C#中寻找的内容,至少编译器必须在其中添加null检查并抛出ArgumentNullException


我想我是说,你要找的是“语法糖”来让你的手指不动。现在,如果您厌倦了键入,我建议您创建一个代码段。

我目前正在用C#编写这个主题。NET的值类型可以为null,但引用类型不存在反向功能


我为引用类型创建了NotNullable,并将问题从if(不再检查null)转移到数据类型域。然而,这使得应用程序在运行时而不是编译时抛出异常,但对我来说仍然非常有用。

这也在Visual Studio 2010 beta 1的C#4.0中实现。DBC与在方法中检查参数是否为null有什么不同,当参数为空时抛出ArgumentNullException f.i.?从功能上讲,它不是真的。不过,从语法上讲,它通过使用适当的属性对方法的外部接口进行修饰,从而明确了方法的意图。我在.NET 3.5/VS2008工作中使用了代码契约:.NET 4.0中的代码契约库可公开用于.NET 3.5和VS2008。