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.