Lambda ifadesi ne anlama _=> exprgeliyor?
_Lambda'ya girdi olarak kullanım amacı nedir ?
Misal:
int count = 0;
list.ForEach(_ => count += 1);
listbir olduğunu IEnumerable<T>, onlar olabilir (ve) hemen kullandıksum = list.Count();
Lambda ifadesi ne anlama _=> exprgeliyor?
_Lambda'ya girdi olarak kullanım amacı nedir ?
Misal:
int count = 0;
list.ForEach(_ => count += 1);
listbir olduğunu IEnumerable<T>, onlar olabilir (ve) hemen kullandıksum = list.Count();
Yanıtlar:
Bu, parametreyi umursamadığınızda kullanılan bir kuraldır.
_desen eşleştirmedeki joker karakterdir. Temelde "Umurumda değil, her zaman bunun eşleşmesini istiyorum " anlamına gelir . Bu "umurumda değil", umursamadığınız şeyleri adlandırmaya gelince taşınır ve oradan diğer programlama dillerine yayılır. Örneğin, Ruby'de _kesinlikle özel bir anlamı olmamasına rağmen , Ruby'de de bu örnekteki ile aynı anlama gelmek için kullanılır .
Kullanışlı olmasa da bir parametre adıdır, ancak ifadenin sahip olduğunu belirtmeniz gerektiğinde (bazı kurallar tarafından) tipik olarak kullanılan addır. derleme kodu almak için bir parametre, ancak bakım gerçekten yok hakkında, bu yüzden onu görmezden geleceksin.
Temelde C # 'daki yasal bir tanımlayıcının oluşturduğu sözdiziminden yararlanıyor ve bir tanımlayıcı bir alt çizgiyle başlayıp başka hiçbir şey içermediğinden, sadece bir parametre adıdır.
Kolayca yazabilirdin:
var _ = 10;
Thread t= new Thread(()=>doSomething(x,y)); t.start();
_geçerli bir değişken adıdır. Sadece _değişken olarak kullanıyorlar .
Ayrıca _ => _.method(), tek satırlık, yöntem çağrısı lambdas'ın kullanımını da ikinci kez yapıyorum , çünkü bu, talimatın bilişsel ağırlığını azaltır. Özellikle jenerikleri kullanırken yazı x => x.method(), "Bu 'x' nedir? Uzayda bir koordinat mı?"
Şu durumu düşünün:
Initialize<Client> ( _=>_.Init() );
Bir Generics çağrısıyla kullanıldığında, bu durumda alt çizgi bir "baypas simgesi" olarak çalışır. Bir tür bildiriminin tekrarlanmasını önlemek için 'var' kullandığınızda olduğu gibi, argüman türünün açık olduğunu ve kullanımdan çıkarılabileceğini tanımlayarak fazlalıktan kaçınır. client=>client.Init()Burada yazmak , talimatı herhangi bir anlam katmadan daha uzun hale getirir.
Açıkçası, bu, açıklayıcı olarak adlandırılması gereken yönteme iletilecek parametreler için geçerli değildir. Örneğin.:Do( id=>Log(id) );
Yöntem çağrıları için tek alt çizgi parametresi kullanımı, lambda tanımlayıcısının jenerik tanımından bağlantısı kesildiği için, tek satırlık yerine bir kod bloğu kullanıldığında pek de haklı gösterilemez. Genel olarak, aynı tanımlayıcı yeniden kullanılacaksa ona açıklayıcı bir ad verin.
Sonuç olarak, ayrıntı, özellikle anonim delegelerin ilk etapta oluşturulmasını basitleştirmek için yaratılan lambdalar için, yalnızca belirsizliği ortadan kaldırmak için haklı çıkarılabilir. Her durumda, okunaklılığı ve özlü olmayı dengeleyerek sağduyu kullanılmalıdır. Sembol, gerçek işlevselliğe yalnızca bir "kanca" ise, bir karakter tanımlayıcı mükemmel şekilde iyidir. For-döngüleri ve indeksleyici olarak "i" ve "j" harflerinde durum böyledir.
Do(id => Log(id))olarak kısaltılması daha iyidir Do(Log).