2011-04-04 20 views
8
if ((new Func</*out*/ string, bool>((/*out*/ string uname) => .... 

fazla ayrıntı: bu giriş fonksiyonunun bir parçasıdır ve sadece bir çıkış parametresi ile değişikliklere benim lamda işlevi olduğunu giriş-name kullanıcı istiyoruz ve onunla logined bana o kullanıcı bool dönüş olduğunu söyledi.Lambda fonksiyonunda 'out' parametrelerini kullanmak için bir numara var mı?

Gerçekten Tuple dönmek ve sonra benim dize değeri elde anlıyorum ama ben tam bazı kişisel netlik için parametre kurtulmak istiyorum. Eğer kullanıcı giriş yapmazsa sadece null dizgisi ile dönerim, sadece lambda fonksiyonlarında parametreler kullanıp kullanamayacağımı bilmek istiyorum.

Ve gerçekten deyimi yerlere ifadelerle kod kadar temiz olmadığını olsun Ama hiçbiri bu derleyici için oldukça kötüyse beni belirtti.

+0

Not, bu tür lambda ifadeleri 'ref/out' parametrelerine sahip olabilir. Örneğin Bu çalışır: 'delege bool Kaydedici (dize adı); Kaydedici f = (üzerinden dizge bar) => { bar = ""; // dönüşü ... } atamak; ' ..sadece' Aksiyon/Func' ile bunu cant. Kendi delegesine ihtiyacın var. – nawfal

cevap

5

Lambda ifadeleri işe yaramaz, ancak delegeler için bir deyim gövdesini kullanarak ince olmalıdır: Sen tanımlamak gerekir ... delegeler için

bool outval = false; // definite assignment 
Func<bool> func =() => { 
    return SomeMethod(out foo); 
}; 
bool returned = func(); 
// check both outval and returned 

kendi:

public delegate bool MyType(out string value); 
+0

Öyleyse burada gerçekten delegeleri kullanmak istemiyorum ama burada iyi çalışıp çalışmadıklarını bile bilmiyordum. – Cynede

+1

Hayır, burada * delegeler istiyorum, sadece lambda ifadeleri değil. –

+0

Tamam ((yeni ChUname ((string uname dışarı) => ... iyi çalışsa, Evet, :) yapmak. – Cynede

2

Parametreleri bir lambda ifadesiyle kullanamazsınız. Eğer temelde .NET C++ tarzı hafıza işaretçileri ulaşmak sağlayan bir çözüm bulmak yaptım dışarı anahtar kelime kullanmak edemesek bu stackoverflow question

+1

Biraz kafa karıştırıcı. İçinde 'out' anahtar sözcüğü ile bir' '(int i, out int j) => ...' gibi bir lambda olabilir ve bu lamda bir delege türü değişkenine atanabilir. Yine de bir ifade ağacına atanamaz. Bahsettiğiniz soru, bir lambda içinde normal bir yöntemin bir “çıkış” parametresini yakalama hakkında konuşuyor. Bu, public statik bool UsualMethod (int int) {/ * normal yöntem gövdesi gibidir */Action f =() => {Console.WriteLine (i); }; ... ...} '. *** Bu *** yasadışı. Lambda, içeren yöntemin bir "çıkış" parametresini yakalamaya çalışır. –

2

bakınız. I found this class nedeni ile bu SO sorusunu açtığım bir çıkış parametresini kullanamamıştım.

public class Ptr<T> 
{ 
    Func<T> getter; 
    Action<T> setter; 

    public Ptr(Func<T> g, Action<T> s) 
    { 
     getter = g; 
     setter = s; 
    } 

    public T Deref 
    { 
     get { return getter(); } 
     set { setter(value); } 
    } 
} 

Kullanım örneği

private IDocumentSession _session = DocumentStore.OpenSession() 

var ptr = new Ptr<IDocumentSession>(
       () => _session, 
       newValue => _session = newValue)) 

session.Deref.SaveChanges(); 
session.Deref = DocumentStore.OpenSession(); 

I toplu işlemler, aynı zamanda, ortam oturum bağlamı terk ederken ince taneli oturum kontrolü gerektiğinde RavenDB ile yıkama oturumu kontrol sağlayan bir toplu programında kullanabilir. Uyarı Sözünün bu tür bir kodun uzun süren bir üretim uygulamasında ne gibi bir etkisi olacağına dair hiçbir fikrim yok çünkü bu durumun GC'u karıştırıp karıştırmayacağından emin değilim.

İlgili konular