Domanda

sto cercando un bel modo per gestire un riferimento null nella gerarchia di oggetti.

vale a dire:

if(null == Object1.Object2.Object3.Property)

Questo esempio un'eccezione Null Riferimento se dire Object2 è nullo.

Nel mio caso non mi interessa ciò che è nulla, solo che qualcosa è. Non voglio davvero mettere provare / catture intorno ad ogni posto che voglio fare qualcosa di simile, così ho cercato di un'alternativa.

Ho sperimentato l'?? operatore ma questo rende per qualche codice cercando brutto dopo due livelli.

Tutte le idee hanno apprezzato.

È stato utile?

Soluzione

Ora, questo potrebbe essere per la tangente ... ma mi piacerebbe suggerire una modifica di progettazione al fine di evitare le brutture e il dolore

La chiamata Object1.Object2.Object3.Property viola i href="http://en.wikipedia.org/wiki/Law_of_Demeter" di Demetra . Invece, se si suppone per arrivare a quella proprietà, Object1 dovrebbe esporre una proprietà in sé ... così si dovrebbe essere chiamando Object1.RetrievedFromTheDepthsProperty
Perché questo è necessario .. è che se il progettista del tipo Object2 cambia il tipo di oggetto restituito dal 'oggetto3' campo / proprietà per uno che non ha la proprietà che stai cercando, devi essere hosed. Il cliente sa troppo sulla struttura interna di Object1. Se Object1 incapsulati in cui i dati si trova all'interno, devi essere sicuro contro i cambiamenti futuri. Anche questa proprietà può fare tutto il nulla controllando internamente come richiesto ... lasciando con il molto più pulito

if (Object1.RetrievedFromTheDepthsProperty == null) {...}

Altri suggerimenti

Questa (null-safe dereferenziazione) è qualcosa che viene sollevato di tanto in tanto, e non; non c'è una risposta in ordine al momento, diverso:

if(Object1 == null || Object1.Object2 == null
        || Object1.Object2.Object3 == null
        || Object1.Object2.Object3.Property == null)

Si può fare qualche caching minore se è necessario (con l'introduzione di variabili), ma che diventa ancora più brutta:

SomeType2 obj2;
SomeType3 obj3;
if(Object1 == null || (obj2 = Object1.Object2) == null
        || (obj3 = obj2.Object3) == null
        || obj3.Property == null)

In generale, vorrei consigliare contro il sopra a meno che davvero, davvero non si vuole chiamare un albergo due volte (perché fa più lavoro di una proprietà dovrebbe)

È possibile utilizzare il Null Object modello .

class Car {
    Engine engine = null;

    public Engine Engine { 
        get { 
            return engine ?? new NullEngine();
        }
    }
}

class Engine {
    string make;
    public virtual string Make { get { return make; } }
}

class NullEngine : Engine {
    public override string Make { get { return null; } }
}

Poi si potrebbe fare:

Car car;
if (car.Engine.Make != null) Console.WriteLine(car.Engine.Make);

Al posto di:

Car car;
if (car.Engine != null && car.Engine.Make != null) Console.WriteLine(car.Engine.Make);   

Si noti che si tratta di un bel po 'di lavoro per definire "oggetti nulli" per l'intero modello. È inoltre necessario fare molta attenzione in modo da non confondere gli utenti del modello. Codice tendono a far saltare rapidamente se si passa null intorno e dimenticare di controllare per esso, ma un "oggetto nullo" può più facile sopravvivere in profondità nella stack e causare problemi sottili dato che non è un vero e proprio oggetto.

Non rispondere direttamente alla tua domanda - solo alcuni suggerimenti:

  • Null opporsi
  • semplicemente non sembra opportuno passare attraverso la gerarchia fino a questo punto (i tuoi tre livelli), magari un po 'il metodo al primo secondo livello / che avrebbe risposto la condizione aiuterebbe

In generale, se non si cura quale proprietà è stato nullo nella vostra gerarchia di oggetti semplicemente non prova contro di essa. Utilizzare un gestore di errore globale per l'applicazione (questo dipenderà dal tipo di applicazione ASP.NET, WinForms, ...) e dire che l'utente qualcosa è andato storto.

Mi piacerebbe fortemente suggerisco di guardare nel seguente post: http://www.hardcodet.net/2008/ 12 / osservare le dipendenze-through-lambda-espressioni-part1

Si riferisce ad un problema simile, e permette anche di gestire facilmente le modifiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top