Signo de interrogación y dos puntos significan en la declaración? ¿qué significa?


¿Qué hace el ? ¿y el colon significa?

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

En la siguiente declaración...

string requestUri = _apiURL + "?e=" + OperationURL[0] + ((OperationURL[1] == "GET") ? GetRequestSignature() : "");
Author: 001, 2011-08-05

7 answers

Esta es la expresión del operador condicional.

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

Por ejemplo

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

Así que si la expresión booleana es true, value tendrá "Alpha", de lo contrario, tendrá "Beta".

Para una trampa común en la que la gente cae, vea esta pregunta en el wiki de la etiqueta C# .

 90
Author: Anthony Pegram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:26

Es el operador condicional ternario .

Si la condición en el paréntesis antes de ? es verdadera, devuelve el valor a la izquierda de :, de lo contrario el valor a la derecha.

 14
Author: Oded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 13:41:20

Es un operador ternario, o una forma corta para if else.

condición ? value if true: value if false

Aquí hay un enlace a más información sobre el tema

Editar: enlace fijo

 7
Author: Spooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 14:10:41

En el caso particular que ha proporcionado, es una asignación condicional. La parte antes del signo de interrogación (?) es una condición booleana, y las partes a cada lado de los dos puntos (:) son los valores a asignar en función del resultado de la condición (el lado izquierdo de los dos puntos es el valor de verdadero, el lado derecho es el valor de falso).

 1
Author: Anthony Grist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 13:41:43
string requestUri = _apiURL + "?e=" + OperationURL[0] + ((OperationURL[1] == "GET") ? GetRequestSignature() : "");

Se puede traducir a:

string requestUri="";
if ((OperationURL[1] == "GET")
{
    requestUri = _apiURL + "?e=" + GetRequestSignature();
}
else
{
   requestUri = _apiURL + "?e=";
}
 1
Author: Kimtho6,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-10 07:15:13

Esto también se conoce como el "inline if", o como por encima del operador ternario. https://en.wikipedia.org/wiki/%3F :

Se usa para reducir código, aunque no se recomienda usar muchos de estos en una sola línea, ya que puede hacer que el mantenimiento del código sea bastante difícil. Imagine:

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

Y podrías continuar un rato.

Termina básicamente lo mismo que escribir:

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

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

También se puede escribir como: (omitiendo el otro, ya que es una cadena vacía)

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

O así:

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

Dependiendo de tu preferencia / el estilo de código que tu jefe te diga que uses.

 1
Author: T.S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 14:17:24

Significa que si "OperationURL[1]" se evalúa como "GET" entonces devuelve "GetRequestSignature()" else return "". Supongo que "GetRequestSignature ()" devuelve una cadena. ¿La CONDICIÓN de sintaxis ? A: B básicamente significa un if-else donde A se devuelve cuando la CONDICIÓN es verdadera y B se devuelve cuando la CONDICIÓN es falsa.

 0
Author: mtijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 13:43:41