2010-06-28 11 views
3

J'ai cette classeClasse nullable?

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; } 

    } 

je voudrais l'utiliser comme ceci

public IQueryable<Listing> FindAll(FilterQuery? filterQuery) 

Est-ce possible?

Merci

+0

On dirait que vous voulez une surcharge, pas une valeur nulle – Marc

+0

Puis-je dupliquer le code? –

Répondre

20

Cela pose immédiatement la question de pourquoi. Les classes sont par définition les types de référence et sont donc déjà nulles. Cela n'a aucun sens de les emballer dans un type nullable.

Dans votre cas, vous pouvez simplement définir:

public IQueryable<Listing> FindAll(FilterQuery filterQuery) 

et appeler FindAll(null) passer aucune requête de filtre. .

Si vous utilisez C#/NET 4.0, une option intéressante est:

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

qui signifie que vous ne disposez même pas de spécifier la valeur nulle. Une surcharge ferait le même tour dans les versions précédentes.

Edit: par demande, la surcharge serait simplement ressembler à:

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

Je vois ... mais la chose est que j'ai une méthode relativement complexe et si je fais une surcharge je vais dupliquer toute la méthode? –

+0

@ile: Pas du tout, voir ma mise à jour post. – Noldorin

+0

Je comprends, merci Noldorin! –

6

Il n'y a pas besoin de le faire; tous les types class sont des types de référence, ce qui signifie qu'il est nullable par définition. En effet, il n'y a aucun moyen pour d'appliquer que c'est non nul au moment de la compilation.

La structure Nullable<T> est conçue pour autoriser les types de valeur (qui, par définition, ne sont pas Null) à représenter une valeur nulle.

Il est également intéressant de noter que la capacité de comparer Nullable<T> avec null (ou Nothing en VB.NET) est le sucre syntaxique; parce que Nullable<T> est une structure, il ne peut pas être réellement null. Dans le cas où il représente une valeur nulle, HasValue est false et Value est default(T).

+0

Vous pouvez appliquer une condition non nulle lors de la compilation en utilisant des assertions et une vérification formelle. Il existe un outil intégré dans Visual Studio 2008/10, si vous installez l'extension Microsoft "Code Contracts". Mais la vérification formelle (statique) ne fonctionne que si chaque partie de votre code est bien affirmée, et si votre condition ne dépend pas d'une partie d'exécution. Plus simple: la vérification formelle ne fonctionne pas. –