Domanda

Probabilmente un C # niubbo domanda, quindi non mi fiamma. Stavo cercando di fare questo:

if (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null)
{
    // ...
}

Ma ho continuato a ottenere un System.NullReferenceException. Ho pensato dal momento che restituisce una stringa che ho potuto solo verificare la presenza di null e andare avanti. Mi c'è voluto un po 'per trovare il modo giusto per farlo:

ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"];
if (cs != null)
{
    this.Connection.ConnectionString = cs.ConnectionString;
}

Quindi, in altri casi, come il controllo di un oggetto Session per un certo valore che vorrei fare un assegno per null in questo modo:

if (Session["EmployeeID"] != null)
{
    _EmployeeID = System.Convert.ToInt32(Session["EmployeeID"]);
}

Quindi volevo solo sapere come si fa a sapere quando si può o non si può fare un assegno per null?

È stato utile?

Soluzione

Il riferimento null eccezione accaduto in oggetto padre (ConfigurationManager.ConnectionStrings [ "PrimaryConnectionString"]). Una volta che si controlla anche, si sta bene.

provare questo:

if ((ConfigurationManager.ConnectionStrings["PrimaryConnectionString"] != null)
&& (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null))
  { etc etc }

Si noti che se si utilizza più metodi da esso, sarebbe utile separare questi controlli.

Altri suggerimenti

Il problema era che si stava controllando:

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]
        .ConnectionString

per un puntatore nullo.

In realtà,

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]

è stato nullo in modo che, quando si è tentato di risolvere il riferimento che per ottenere la stringa di connessione, che è quando si ha l'eccezione. In effetti, quello che stai facendo è:

null.ConnectionString

che è problematico.

Io tendo a uno evitare molti strati di dereferencing in una singola istruzione o posizionare un gestore di eccezioni in tutto il tutto per catturare i problemi in qualsiasi momento.

I tuoi primi test controlla se la stringa di connessione nel i ConnectionStringSettings è nullo. Il secondo test controlla se i ConnectionStringSettings riferimento stesso è nullo. E 'la differenza tra:

if (person.Name == null)

e

if (person == null)

Il primo andrà botto se person è nullo; il secondo non sarà posto se person.Name è nullo. Se si desidera controllare entrambi, è necessario:

if (person == null || person.Name == null)

Alcune lingue (come Groovy) hanno un operatore di dereferenziazione null-sicuro, in modo che si può fare:

var x = Expr1?.Expr2?.Expr3?.Expr4;

Ciò rende questo tipo di prova più facile, se si vuole verificare se qualsiasi parte di una potenzialmente lunga espressione è null. Purtroppo C # non ha che: (

  

Quindi volevo solo sapere come si fa   sapere quando si può o non si può fare il check   per nulla?

possono verificare la presenza di nulla in qualsiasi momento ti piace (tranne che con i tipi di valore non nullable, che non può essere nullo).

dovrebbe e verificate per nulla in qualsiasi momento si desidera accedere i membri di un oggetto, e non si è certi che la variabile che contiene l'oggetto non è nullo.

Un paio di luoghi tipici per il controllo nullo sono:

  • È possibile ottenere un oggetto passato a voi come un parametri in una funzione che si sta scrivendo. Fare un null-controllo sul parametro prima di utilizzarlo.
  • Si chiama un metodo (o del recupero di un valore di proprietà) la restituzione di un oggetto che si desidera utilizzare. Fare un null-controllo su quel valore di ritorno prima di utilizzarlo.
  • si passa un oggetto a un metodo in cui è documentato che possa gettare un NullReferenceException se il parametro è nullo. Fare un controllo nullo sulla variabile che si desidera passare prima di chiamare il metodo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top