2

おそらくC#の初心者の質問なので、私を怒らせないでください。私はこれをやろうとしていました:

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

しかし、私は取得し続けましたSystem.NullReferenceExceptionnull確認して先に進むことができる文字列が返されるので、と思いました。それを行う正しい方法を見つけるのに少し時間がかかりました:

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

したがって、他の例では、Sessionオブジェクトの値をチェックするnullように、次のようにチェックします。

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

だから私はあなたがチェックをすることができるかできないかをどうやって知るのか知りたかっただけですnullか?

4

4 に答える 4

11

あなたの問題はあなたがチェックしていたことでした:

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]
        .ConnectionString

nullポインタの場合。

実際には、

ConfigurationManager
    .ConnectionStrings["PrimaryConnectionString"]

nullだったので、接続文字列を取得するためにそれを逆参照しようとすると、例外が発生しました。事実上、あなたがしていることは次のとおりです。

null.ConnectionString

これは問題があります。

私は、単一のステートメントで間接参照の多くの層を回避するか、いつでも問題をキャッチするために全体の周りに例外ハンドラーを配置する傾向があります。

于 2009-07-24T06:09:51.490 に答える
4

親オブジェクト(ConfigurationManager.ConnectionStrings ["PrimaryConnectionString"])でnull参照例外が発生しました。一度チェックすれば大丈夫です。

これを試して:

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

それからより多くのメソッドを使用する場合は、これらのチェックを分離すると便利であることに注意してください。

于 2009-07-24T06:09:33.190 に答える
4

最初のテストでは、ConnectionStringSettingsの接続文字列がnullであるかどうかを確認します。2番目のテストでは、ConnectionStringSettings参照自体がnullであるかどうかを確認します。それは次の違いです:

if (person.Name == null)

if (person == null)

personnullの場合、最初のものは強打します。person.Namenullの場合、2番目は検出されません。両方をチェックしたい場合は、以下が必要です。

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

一部の言語(Groovyなど)にはnullセーフな間接参照演算子があるため、次のことができます。

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

これにより、潜在的に長い式のいずれかの部分がnullであるかどうかをテストする場合に、この種のテストが容易になります。残念ながら、C#にはそれがありません:(

于 2009-07-24T06:11:08.600 に答える
3

だから私はあなたがnullをチェックできるかできないかをどうやって知るのか知りたかっただけですか?

nullはいつでもチェックできます(nullにできない値型を除き、nullにすることはできません)。

オブジェクトのメンバーにアクセスするときはいつでもnullをチェックする必要があり、オブジェクトを含む変数がnullでないかどうかはわかりません。

nullチェックの典型的な場所は次のとおりです。

  • 作成している関数のパラメーターとしてオブジェクトが渡されます。パラメータを使用する前に、パラメータをnullチェックしてください。
  • 使用したいオブジェクトを返すメソッドを呼び出す(またはプロパティ値をフェッチする)。使用する前に、その戻り値をnullチェックしてください。
  • NullReferenceExceptionパラメータがnullの場合にスローすることが文書化されているメソッドにオブジェクトを渡します。メソッドを呼び出す前に、渡す変数に対してnullチェックを実行します。
于 2009-07-24T06:14:39.607 に答える