为什么空合并运算符在c#中破坏了我的字符串赋值?

时间:2012-07-09 15:26:26

标签: c# asp.net

我在网络表单中创建查询字符串,并且我正在处理可能为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 =结束。 我知道如何解决这个问题,但我不知道为什么它一开始就停止了工作。有什么提示吗?

5 个答案:

答案 0 :(得分:14)

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

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

See the precedence chart here

答案 1 :(得分:11)

尝试使用括号告诉编译器你的意思。

例如:

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

答案 2 :(得分:3)

你需要添加大括号,即

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

答案 3 :(得分:3)

如果您查看precedence of operators in C#more up to date but slightly less helpful version here),则可以看到+高于??

这意味着您实际上要求??之后的大部分陈述被视为一个区块。

所以,

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

实际上意味着:

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

所以你可能想要其他答案所说的括号。我只是想我会尝试解释一下。

答案 4 :(得分:3)

问题比你想象的多:

  1. 正如你所说,它不起作用
  2. 大约有20个字符串创建(srting是不可变的,string + string创建一个新字符串并将字符串的内容复制到其中,因此它的很多内存复印)。 Hovewer,C#编译器为你做了一个优化,所以这次你很幸运。
  3. 几乎无法读取
  4. 考虑使用String.Format方法。

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

    另外,正如其他人指出的那样,运算符优先级错误(+的优先级高于??),但这种方法没有它,因为那些合并运算符将驻留在参数构造中。