问号和语句中的冒号。这是什么意思?


71

问号(?)和冒号(:)是什么意思?

((OperationURL[1] == "GET") ? GetRequestSignature() : "")

它显示在以下语句中:

string requestUri = _apiURL + "?e=" + OperationURL[0] + ((OperationURL[1] == "GET") ? GetRequestSignature() : "");

Answers:


106

这是条件运算符表达式。

(condition) ? [true path] : [false path];

例如

 string value = someBooleanExpression ? "Alpha" : "Beta";

因此,如果布尔表达式为true,则value将保存“ Alpha”,否则将保存“ Beta”。

有关人们会遇到的常见陷阱,请参见C#标签wiki中的此问题


1
值== someBooleanExpression
Yu Zhang

8
@YuZhang:不,是正确的。示例:字符串值= 1 == 2?“ Alpha”:“ Beta”; - >值将举行“测试版”
迈克尔Polla

14

它是三元条件运算符

如果括号中的条件在?true之前,则返回值的左侧:,否则返回右侧的值。



2

这也称为“ inline if”,或在三元运算符之上。 https://zh.wikipedia.org/wiki/%3F

它用于减少代码,尽管不建议在一行中使用很多代码,因为这可能会使代码维护变得非常困难。想像:

a = b?c:(d?e:(f?g:h));

你可以继续一会儿。

最终与写作基本相同:

if(b)
  a = c;
else if(d)
  a = e;
else if(f)
  a = g;
else
  a = h;

在您的情况下,“字符串requestUri = _apiURL +“?e =” + OperationURL [0] +(((OperationURL [1] ==“ GET”)?GetRequestSignature():“”);“

也可以写成:(省略else,因为它是一个空字符串)

string requestUri = _apiURL + "?e=" + OperationURL[0];
if((OperationURL[1] == "GET")
    requestUri = requestUri + GetRequestSignature();

或像这样:

string requestUri;
if((OperationURL[1] == "GET")
    requestUri = _apiURL + "?e=" + OperationURL[0] + GetRequestSignature();
else
    requestUri = _apiURL + "?e=" + OperationURL[0];

根据您的偏好/老板告诉您使用的代码样式。


1

在您提供的特定情况下,这是有条件的分配。问号(?)之前的部分是布尔条件,冒号(:)两侧的部分是根据条件的结果分配的值(冒号的左侧是true的值,右侧是side是false的值)。


1
string requestUri = _apiURL + "?e=" + OperationURL[0] + ((OperationURL[1] == "GET") ? GetRequestSignature() : "");

可以翻译成:

string requestUri="";
if ((OperationURL[1] == "GET")
{
    requestUri = _apiURL + "?e=" + GetRequestSignature();
}
else
{
   requestUri = _apiURL + "?e=";
}

0

这意味着,如果“ OperationURL [1]”的计算结果为“ GET”,则返回“ GetRequestSignature()”,否则返回“”。我猜这里“ GetRequestSignature()”返回一个字符串。语法CONDITION?A:B基本上代表if-else,如果CONDITION为true则返回A,而CONDITION为false则返回B。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.