Quali sono le motivazioni alla base della realizzazione di operatori veri e falsi sovraccaricabili?

3

Ho posto questa domanda su Stack Overflow ed è stata accolta con una ricezione negativa. Ho pensato che Stack Overflow non era il posto giusto per porre questa domanda, quindi ho deciso di postarlo qui.

Oltre a fare tipi come SqlBoolean agire in modo più naturale, c'è qualche altra ragione? Se la creazione di tre tipi booleani di stato è l'unico scopo di questa decisione, è una buona ragione per aggiungere una funzionalità che è usata così raramente in una lingua?

Ecco un esempio:

public class ThreeStateBool
{
    private bool? value;

    public ThreeStateBool(bool? value)
    {
        this.value = value;
    }

    public static bool operator false(ThreeStateBool tsb)
    {
        return tsb.value == false;
    }

    public static bool operator true(ThreeStateBool tsb)
    {
        return tsb.value == true;
    }
}

Ora che ho sovraccaricato true e false , posso usare questo oggetto in un'istruzione condizionale come:

if (new ThreeStateBool(false))
    Console.WriteLine("false");
else if (new ThreeStateBool(true))
    Console.WriteLine("true");
else if(new ThreeStateBool(null))
    Console.WriteLine("null");
    
posta brz 16.09.2014 - 23:36
fonte

1 risposta

2

Devi avere un po 'di contesto qui: penso che il punto principale che manca sia che questa era una funzionalità pre C # 2.0, il che significa che è una funzionalità che precede i tipi nullable. La pagina che descrive l'overloading dell'operatore 'vero' è chiaramente orientata verso la direzione di avere un valore booleano nullable senza usare un supporto nullable come supporto.

Ma ci sono altri casi in cui potresti voler trattare un'istanza di un oggetto come un booleano, per esempio dove vuoi controllare se lo stato interno di un oggetto è ok, e vorresti scrivere qualcosa in stile C:

if (obj) {
    obj.DoSomething();
}

È una possibilità, non è una cosa obbligatoria che vorresti fare. È uno strumento da utilizzare se necessario e, come ben notato, è in qualche modo sostituito dall'uso di tipi nullable; tuttavia, potresti voler scrivere qualcosa di simile a ThreeStateBoolean quando sai, ad esempio, che "falso" significa "null o falso". Scrivere quegli assegni in linea ogni volta è un affare noioso.

    
risposta data 17.09.2014 - 06:26
fonte

Leggi altre domande sui tag