/ / Operator warunkowy? - c #, .net, operator trójargumentowy, operator warunkowy

Operator warunkowy? - c #, .net, ternary-operator, operator warunkowy

var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount :
(i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount :
definition.AdditionalPetDiscount;

Czy mógłbyś mi wyjaśnić ten fragment kodu? Wiem o operatorze trójskładnikowym. Ale powyższe nie jest takie.

Normalny operator trójskładnikowy wygląda tak:

PaidDate = ( paidDate == null ? DateTime.Now : paidDate);

Odpowiedzi:

6 dla odpowiedzi № 1

?: jest operatorem trójskładnikowym. ?? jest operatorem koalescencji zerowej. Służy do zwracania pierwszego wyrażenia, które nie jest puste.

Fragment, który opublikowałeś, korzysta z obu operatorów. Odpowiada to następującym if/else skonstruować:

if (i == 1)
{
if (definition.SecondPetDiscount != null)
{
discount = definition.SecondPetDiscount;
}
else
{
discount = definition.AdditionalPetDiscount;
}
}
else if (i == 2)
{
if (definition.ThirdPetDiscount != null)
{
discount = definition.ThirdPetDiscount;
}
else
{
discount = definition.AdditionalPetDiscount;
}
}
else
{
discount = definition.AdditionalPetDiscount;
}

W tym fragmencie łączą ze sobą wiele operacji trójskładnikowych. Czasami przydatne jest również połączenie wielu operacji koalescencji zerowej, np. var foo = a ?? b ?? c.


4 dla odpowiedzi nr 2

To jest operator koalescencji zerowej w C #. Jest to skrót, który zwraca lewą stronę (jeśli lewa strona nie jest pusta) i w przeciwnym razie zwraca prawą stronę


4 dla odpowiedzi nr 3

To jest mieszanka.

W tej instrukcji istnieją dwie operacje warunkowe (trójskładnikowe), a także operacje null coalescing operator.

Drugą „opcją” pierwszej operacji trójskładnikowej jest cała operacja trójskładnikowa.


2 dla odpowiedzi № 4

Myślę, że jesteś zmieszany z operatorem koalescencji zerowej lub ??

definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount

oznacza to, że jeśli definition.ThirdPetDiscount ma wartość null, niż użycie definition.AdditionalPetDiscount

operator trójskładnikowy wokół tego zachowuje się jakregularny operator trójskładnikowy. operator koalescencji zerowej jest po prostu zagnieżdżony wewnątrz niego, a ty masz również jeden operator trójskładnikowy zagnieżdżony w drugim operatorze trójskładnikowym


0 dla odpowiedzi № 5
var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount :
(i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount :
definition.AdditionalPetDiscount;

Oczywiście, że (bool) ? code : code wzorzec przekłada się na blok if - else.

Więc dostajemy

var discount;
if( i==1 )
{
discount = definition.SecondPetDiscount ?? definition.AdditionalPetDiscount;
}
else if( i==2 )
{
discount = definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount;
}
else
{
discount = definition.AdditionalPetDiscount;
}

object ?? object jest zerowym koalescencyjnym operatorem trójskładnikowym. W ten sposób weźmie pierwszy nie-zerowy obiekt w koalescencję i zwróci go. Na liście może być dowolna liczba obiektów.

Więc var discount tutaj jest ustawiony na definition.AdditionalPetDiscount jeśli 2 lub 3 zniżka dla zwierząt domowych jest zerowa lub jeśli i nie wynosi 1 lub 2.


0 dla odpowiedzi № 6

Jeśli i wynosi 1, wówczas rabat zostanie ustawiony na definition.SecondPetDiscount, chyba że ma wartość null, w którym to przypadku zostanie ustawiony na definicję.AdditionalPetDiscount.

Jeśli i wynosi 2, wówczas rabat zostanie ustawiony na definicję. TrzeciPetDiscount, chyba że ma wartość NULL, w którym to przypadku zostanie ustawiony na definicję.

Jeśli i nie jest ani 1, ani 2, zostanie ustawiona na definicję. DodatkowePetDiscount.