Perché non potevo verificare la presenza di un riferimento null in una stringa di connessione?
-
19-09-2019 - |
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
?
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.