1

最近、私は多くの奇妙なシナリオに遭遇しています:-)

ASP.Net アプリケーションで次の 2 つのコードをテストしました。コード 1 は (予想どおり) 例外をスローしますが、コード 2 は (予想に反して) 文字列値が null の場合に例外をスローしません。

  1. この場合、「<strong>EVAL」が例外をスローしないのはなぜですか?
  2. EVAL は常にこのように機能するのでしょうか (つまり、「例外なし」)、それともただの運でしょうか?
  3. 「Eval」が空の文字列を返すという MSDN リファレンスはありますか?

//コード 1 : 例外を発生させる

 string test = Convert.ToString(subscriber.EncryptedSSN).Substring(0, Convert.ToString(subscriber.EncryptedSSN).Length >= 5 ? 5 : Convert.ToString(subscriber.EncryptedSSN).Length);

//コード 2 : 例外をスローしません

 <%# Convert.ToString(Eval("EncryptedSSN")).Substring(0, Convert.ToString(Eval("EncryptedSSN")).Length  >= 5 ? 5 : Convert.ToString(Eval("EncryptedSSN")).Length)  %>

参考文献

  1. DBNull の評価チェックが機能しない
  2. Convert.ToString は、「NULL オブジェクト」と「NULL 文字列」で異なる動作をします。
  3. 返されるデータ型は、テーブル内のデータによって異なります
4

2 に答える 2

6

あなたのシナリオは間違っているようです。最初のものは.NET 4で例外を与えません:

object foo = null;

string test = Convert.ToString(foo).Substring(0, Convert.ToString(foo).Length >= 5 ? 5 : Convert.ToString(foo).Length);

これは、「値の文字列表現、または値が null の場合は String.Empty」をConvert.ToString() 返すためです。

String.Empty は null ではなく、長さ 0 の文字列であるため、メソッドが呼び出されても例外はスローされません。

少し検索してこのページにたどり着き、ASP でのデータバインディング全般について説明し、「実行時に Eval メソッドが DataBinder オブジェクトの Eval メソッドを呼び出す」と説明しています。DataBinder.Eval()はオブジェクトを返すためConvert.ToString(Eval(Something))、少なくとも を返すString.Emptyため、結果のメンバーまたはプロパティにアクセスしようとしても NullReferenceException をスローしません。

于 2012-11-22T13:51:02.303 に答える
1

あなたのEval評価は?null の代わりである可能String.Empty性があり、その場合、例外は発生しません。

于 2012-11-22T13:50:58.987 に答える