我在网络表单中创建查询字符串,并且我正在处理可能为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 =结束。 我知道如何解决这个问题,但我不知道为什么它一开始就停止了工作。有什么提示吗?
答案 0 :(得分:14)
+
的优先级高于??
,因此您需要在括号中包围空的合并表达式。
"&_leadCon=" + (_leadCon.Value ?? -1) + "&_acctExec=" + (_acctExec.Value ?? -1 )
答案 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)
问题比你想象的多:
string
+ string
创建一个新字符串并将字符串的内容复制到其中,因此它的很多内存复印)。 Hovewer,C#编译器为你做了一个优化,所以这次你很幸运。考虑使用String.Format
方法。
string urlTemplate = 'BillabilityDetail.aspx?_startDate={0}&_endDate={1}';
pass = String.Format(urlTemplatel, _startDate.Text, _endDate.Text);
另外,正如其他人指出的那样,运算符优先级错误(+
的优先级高于??
),但这种方法没有它,因为那些合并运算符将驻留在参数构造中。