2012-09-03 3 views
3

Je dois transmettre des valeurs à une méthode, avec une indication si chaque valeur est spécifiée ou non spécifiée, puisque null est une valeur valide elle-même, et ne peut donc pas être interprétée comme "non spécifiée" ".Objet de valeur avec indicateur "specified"

J'ai pris l'approche générique et créé un conteneur simple pour de telles valeurs (voir ci-dessous), mais est-ce la bonne façon d'y aller? Y a-t-il de meilleures façons d'aborder ce problème - p. est-ce qu'une classe comme celle-là existe déjà dans le cadre?

public struct Omissible<T> 
{ 
    public readonly T Value; 
    public readonly bool IsSpecified; 
    public static readonly Omissible<T> Unspecified; 

    public Omissible(T value) 
    { 
    this.Value = value; 
    this.IsSpecified = true; 
    } 
} 

La signature de la méthode pourrait ressembler à ce qui suit, ce qui permet à l'appelant d'indiquer que certaines valeurs ne doivent pas être mises à jour (non spécifié), d'autres doivent être réglés sur null/une autre valeur (spécifiée).

public void BulkUpdate(int[] itemIds, 
    Omissible<int?> value1, Omissible<string> value2) // etc. 
+0

Voulez-vous que votre deuxième constructeur prenne un paramètre 'T' et n'en fasse rien? –

+2

Ca me va. Je vous suggère d'utiliser un 'struct' au lieu d'un' class'. Vérifiez également le second 'constructor', le paramètre' value' n'est pas utilisé. – devundef

+0

Oups, corrigé. Struct aussi une bonne idée. – bernhof

Répondre

1

C'est le meilleur que l'on puisse théoriquement faire. Afin de distinguer un général T d'un "T ou null" vous avez besoin d'un état possible plus qu'une variable de type T peut contenir. Par exemple, un int de 32 bits peut contenir les états 2^32

Si vous souhaitez enregistrer une valeur null en plus, vous avez besoin de 2^32 + 1 états possibles qui ne correspondent pas à un emplacement de 4 octets.

Vous avez également besoin d'une valeur bool. (En théorie, vous avez juste besoin de log2(2^32 + 1) - 32 bits pour le cas Omissible<int>, mais un moyen facile de stocker cela est un bool).

+0

Il a besoin de * deux * valeurs de contrôle apparemment, 'null' et * unspecified *. Ce qui pourrait appeler un 'byte' et un' int'. –

+0

Si c'est le cas, vous avez raison. – usr

Questions connexes