5

我正在 Web 表单中创建一个查询字符串,并且我正在处理来自可能为空的参数的值。有很多方法可以检查和修复这些问题,但我发现最优雅的方法如下:

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

+优先级高于??,因此您需要将空合并表达式括在括号中。

"&_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# 中运算符的优先级此处更新更多但实用性稍差的版本),您会看到+上面的内容??

这意味着您实际上是在要求将您的大部分陈述??视为一个块。

所以,

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

实际上意味着:

添加"hello""this is" + " a test"如果value为空则添加,否则添加value自身。

因此,正如其他答案所说,您可能希望在其中使用括号。我只是想我会尝试再解释一下。

于 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 回答