5

Webフォームでクエリ文字列を作成していて、nullの可能性があるパラメーターの値を処理しています。これらをチェックして修正する方法はたくさんありますが、私が見つけた最もエレガントな方法は次のとおりです。

string pass;
pass = "BillabilityDetail.aspx?_startDate=" + _startDate.Text + "&_endDate=" + _endDate.Text + 
       "&_isContractor=" + _isContractor.SelectedValue + "&_busUnit=" + _busUnit.Text 
       + "&_projectUnit=" + _projectUnit.SelectedValue + "&_leadCon=" + _leadCon.Value ?? -1
       + "&_acctExec=" + _acctExec.Value ?? -1 + "&_isBillable=" + _isBillable.SelectedValue + 
       "&_isActive=" + _isActive.SelectedValue + "&_include=" + _include.SelectedValue;

唯一の問題は...それは機能しません。コードがこの部分に到達すると、

"&_leadCon=" + _leadCon.Value ?? -1 + "&_acctExec=" + _acctExec.Value ?? -1 

文字列は値の割り当てを停止します。したがって、文字列は&_leadCon=で終わります。これを回避する方法は知っていますが、そもそもなぜ機能しなくなったのかわかりません。任意のヒント?

4

5 に答える 5

15

はより+も優先順位が高い??ため、null合体式を括弧で囲む必要があります。

"&_leadCon=" + (_leadCon.Value ?? -1) + "&_acctExec=" + (_acctExec.Value ?? -1 )

ここで優先順位チャートを参照してください

于 2012-07-09T15:28:24.797 に答える
11

括弧を使用して、コンパイラーに正確に意味を伝えてみてください。

例えば:

"&_leadCon=" + (_leadCon.Value ?? -1) + "&_acctExec=" + (_acctExec.Value ?? -1)
于 2012-07-09T15:28:14.013 に答える
3

中かっこを追加する必要があります。

"&_leadCon=" + (_leadCon.Value ?? -1) + "&_acctExec=" + (_acctExec.Value ?? -1)
于 2012-07-09T15:29:30.783 に答える
3

C# での演算子の優先順位(より最新ですが、少し役に立たないバージョンはこちら) を見ると、+上に来ることがわかります??

??これは、実際にはステートメントの大部分を1 つのブロックとして扱うように求めていることを意味します。

そう、

string test = "hello" + value ?? "this is" + " a test"

実際には次のことを意味します。

を追加"hello"し、null の"this is" + " a test"場合は追加し、それ以外の場合はそれ自体を追加します。valuevalue

したがって、他の回答が言ったように、おそらくそこに括弧が必要です。もう少し説明してみようと思いました。

于 2012-07-09T15:31:16.867 に答える
3

あなたが思っているよりも多くの問題があります:

  1. おっしゃるとおり、うまくいきません
  2. 約 20 の文字列の作成があります (srting は不変です。string+stringは新しい文字列を作成し、文字列の内容をその中にコピーするため、メモリのコピーが大量に発生します)。ただし、C# コンパイラが最適化を行うため、今回は幸運です。
  3. ほとんど読めない

String.Formatメソッドの使用を検討してください。

string urlTemplate = 'BillabilityDetail.aspx?_startDate={0}&_endDate={1}';
pass = String.Format(urlTemplatel, _startDate.Text, _endDate.Text);

また、他の人が指摘したように、演算子の優先順位エラー (+よりも優先順位が高い??) がありますが、これらの合体演算子はパラメーターの構築に存在するため、このアプローチにはそれがありません。

于 2012-07-09T15:31:36.420 に答える