2010-06-28 33 views
3

我有这个类可空类?

public class FilterQuery 
    { 
     public FilterQuery() { } 

     public string OrderBy { set; get; } 
     public string OrderType { set; get; }   

     public int? Page { set; get; } 
     public int ResultNumber { set; get; } 

    } 

我想用它像这样

public IQueryable<Listing> FindAll(FilterQuery? filterQuery) 

这可能吗?

感谢

+0

听起来像你想过载,而不是可空 – Marc 2010-06-28 13:21:14

+0

然后,我复制的代码? – 2010-06-28 13:34:00

回答

20

这立即回避的为什么的问题。类定义为参考类型,因此已经可以为空。将它们包装为可空类型是没有意义的。

在你的情况,你可以简单地定义:

public IQueryable<Listing> FindAll(FilterQuery filterQuery) 

,并呼吁FindAll(null)通过没有过滤器的查询。 。

如果您正在使用C#/。NET 4.0,一个不错的选择是:

public IQueryable<Listing> FindAll(FilterQuery filterQuery = null) 

这意味着你甚至不用到指定空。重载会在以前的版本中做同样的技巧。

编辑:每请求,超载只会看起来像:

public IQueryable<Listing> FindAll() 
{ 
    return FindAll(null); 
} 
+0

我明白了...但事情是我有比较复杂的方法,如果我超载,我会复制整个方法? – 2010-06-28 13:33:42

+0

@ile:完全没有,请参阅我更新的帖子。 – Noldorin 2010-06-28 13:35:51

+0

我明白了,谢谢Noldorin! – 2010-06-28 13:41:52

6

有没有必要这样做;所有class类型都是引用类型,这意味着根据定义它可以为空。的确,在编译时无法实现它是非空

Nullable<T>结构被设计为允许值类型(根据定义非空)表示空值。

还值得注意的是,比较Nullable<T>null(或VB.NET中的Nothing)的能力是语法糖;因为Nullable<T>是一个结构体,它实际上不可能是null。在其代表空值的情况下,HasValuefalseValuedefault(T)

+0

您可以在编译时使用断言和形式验证来强制执行非空条件。如果您安装Microsoft“代码合同”扩展,则Visual Studio 2008/10中有一个内置工具。但是,正式(静态)验证只有在你的代码的每个部分都被很好地声明,并且你的条件不依赖于运行时才有效。 更简单:形式验证不起作用。 – 2010-06-28 13:26:32