?: ?? IF Yerine Operatörler | ELSE


85
public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

?: ??Operatörleri TAM OLARAK If / Else olarak kullanabilir miyim ?


Sorum:
Aşağıdakiler nasıl yazılır?: ?? operatörler

[1]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[2]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

Kısaca : ?: ??Operatörle hiçbir şey nasıl yapılmaz , hiçbir şey iade edilmez ve birden fazla talimat nasıl yapılır ?


1
Ancak aynı şekilde davranmayacaktır. Koşullu if / else dallanma kullanmayarak, değişkene her eriştiğinizde koşulsuz olarak (ve gereksiz olarak) değişkeni yeniden atarsınız. Bu, özellikle çok iş parçacıklı kodunuz varsa çok hızlı bir şekilde kötüye gidebilir. Sadece yapma.
Jeff Mercado

1
Source özelliğinin get erişimcisi Source özelliğini (get erişimcisi) döndürüyorsa, sonsuz / özyinelemeli bir çağrınız olur.
John K

1
İlk kod parçacığı bir özellik getter sahiptir kendi ayarlayıcı çağırır sırayla, yinelemeli kendi getter çağırır . Beni orada kaybettin çünkü sahada böyle bir şeyin işe yaraması mümkün değil. Lütfen sorunuzu düzeltin ve tam olarak ne elde etmek istediğinizi açıklayın.
Frédéric Hamidi

Geri Dönmek Yok mu? Bu VB. Burada c # yazıyorsunuz.
Görev

@Görev nasıl yapılır, bu satır soru için bir yorum
Ahmed Ghoneim

Yanıtlar:


199

[1] için, yapamazsınız: bu işleçlerin işlem yapmak için değil, bir değer döndürmesi için yapılmıştır.

İfade

a ? b : c

için değerlendirir beğer asadık ve değerlendirir ceğer ayanlıştır.

İfade

b ?? c

için değerlendirir beğer bboş değil ve değerlendirir ceğer bboş.

Eğer yazarsan

return a ? b : c;

veya

return b ?? c;

her zaman bir şey iade edecekler .

[2] için, "çoklu işlemlerinizi" gerçekleştiren doğru değeri döndüren bir işlev yazabilirsiniz, ancak bu muhtemelen kullanmaktan daha kötüdür if/else.


41

Üçlü operatör ( ?:) akış kontrolü için tasarlanmamıştır , yalnızca koşullu atama için tasarlanmıştır . Programınızın akışını kontrol etmeniz gerekiyorsa, if/ gibi bir kontrol yapısı kullanın else.


5
İnsanların if / else yerine iç içe geçmiş üçlü ifadeler kullandıklarını ve okunması ve hata ayıklaması zor bir kod ürettiğini de ekleyeceğim. Her yerde kötü mojo.
ckramer

4
Bazen iç içe geçmiş üçlü operatörler, boşluk doğru şekilde kullanılırsa daha okunabilir kod üretir.
gerçek

2
@truth: Evet, iç içe geçmişe karşı hiçbir şeyim yok ?:. Ancak bunların kontrol akışı için ve özellikle iç içe geçmiş kontrol akışı için kullanılmasıyla ilgili büyük bir sorunum var !
Oliver Charlesworth

11

Atıf?: Operatör (C # Referansı)

Koşullu operatör (? :) Boole ifadesinin değerine bağlı olarak iki değerden birini döndürür. Koşullu işlecin sözdizimi aşağıdadır.

Atıfta ?? Operatör (C # Referansı)

?? operatörü, null-coalescing operatörü olarak adlandırılır ve null yapılabilir değer türleri ve başvuru türleri için varsayılan bir değer tanımlamak için kullanılır. Boş değilse sol taraftaki işleneni döndürür; aksi takdirde doğru operandı döndürür.

Bunun anlamı:

[Bölüm 1]

return source ?? String.Empty;

[Bölüm 2] uygulanamaz ...


3
Bu hiçbir şey yapmamaktan farklı. Boş bir dize döndürür.
gerçek

1
Elbette, ama OP'nin istediği bu değildi. Ne olursa olsun - Bu OP "dönüş şey" istedi bu benim hatam değil bu muhtemelen anlamına gelebilir.
gerçek

1
@trutheality: Kimse bunun senin hatan olduğunu söylemedi .. Ancak, OP hiçbir şeyi geri vermek istemedi ve ben de bunu sağladım.
Akram Shahda

3

"Hiçbir şey yapma" gerçekten işe yaramıyor mu?

// Hiçbir Şeyi Döndür ile aslında null döndürmeyi kastediyorsan yaz

return Source;

demek istiyorsan kod yolunu yok say ve sonra yaz

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

Ve son için

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.

3

Üçlü operatör iki değerden birini GERİ DÖNÜŞTÜRÜR. Veya durumuna bağlı olarak iki ifadeden birini çalıştırabilir, ancak istenmeyen yan etkilere yol açabileceğinden bu genellikle iyi bir fikir değildir.

bar ? () : baz();

Bu durumda, baz bir şey yaparken () hiçbir şey yapmaz. Ancak kodu yalnızca daha az net hale getirdiniz. Daha net ve bakımı daha kolay olan daha ayrıntılı kodlara başvururum.

Dahası, bu hiç de mantıklı değil:

var foo = bar ? () : baz();

çünkü () dönüş türü yoktur (geçersizdir) ve baz bu örnekte çağrı noktasında bilinmeyen bir dönüş türüne sahiptir. Kabul etmezlerse, derleyici şikayet edecek ve yüksek sesle.


2

Kodunuzun ayrıntı düzeyiyle ilgileniyorsanız, ifadeleri kötüye kullanmak yerine bunu yazacağım.

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");

İfadeleri kötüye kullanmıyorum, sadece düşünüyorum!
Ahmed Ghoneim

1

?: yol operatörüdür. (bunu doğru yazdığıma inanıyorum) ve kullanımı basit. bir boole yükleminde olduğu gibi? iftrue: ifalse; Ancak rvalue = yüklem? Deki gibi bir rvalue / lvalue'nuz olması gerekir? iftrue: iffalse;

eski int i = x < 7 ? x : 7;

x 7'den küçük olsaydı, x atanırdı, yoksa 7 olurdu.

aynı zamanda iade olarak da kullanabilirsiniz. return x < 7 ? x : 7;

Yine, yukarıdaki gibi, bu aynı etkiye sahip olacaktır.

böylece, Source = Source == value ? Source : string.Empty;ben senin ulaşmaya çalıştığınız budur inanıyoruz.


6
Bunu sevdim. Yol operatörü : A'dan B'ye ... veya A'dan C'ye ... gitmenize yardımcı olur A'ya bağlı olarak
Rick Sladkey

Evet, üçlü demek istiyor. Ancak doğru isim "şartlı" dır.
Erick G. Hagstrom


0

Bunun bir operatör olduğunu ve birini ya da diğerini geri getireceğini sanmıyorum. Bu, belirli durumlarda bunun için kullanılabilmesine rağmen, eğer else ifadesinin değiştirilmesi değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.