Hayır, ancak bir temsilci kullanabilirsiniz (ör. Action
) alternatif olarak kullanabilirsiniz.
Kısmen Robin R'nin isteğe bağlı bir çıkış parametresi istediğimi düşündüğüm bir durumla karşılaştığında verdiği yanıttan esinlenerek bunun yerine bir Action
delege kullandım . Ben Action<int>
farklılıkları ve benzerlikleri göstermek için kullanmak için değiştirmek için onun örnek kod ödünç aldım :
public string foo(string value, Action<int> outResult = null)
{
// .. do something
outResult?.Invoke(100);
return value;
}
public void bar ()
{
string str = "bar";
string result;
int optional = 0;
// example: call without the optional out parameter
result = foo (str);
Console.WriteLine ("Output was {0} with no optional value used", result);
// example: call it with optional parameter
result = foo (str, x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
// example: call it with named optional parameter
foo (str, outResult: x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
}
Bu, isteğe bağlı değişkenin kaynakta normal bir int olarak görünmesi avantajına sahiptir (derleyici bunu kullanıcı tanımlı bir sınıfta açıkça sarmak yerine bir kapatma sınıfına sarar).
Derleyici Action
, işlev çağrısı çıkmadan önce çağrının yapılamayacağını kabul edemediğinden, değişkenin açık başlatılması gerekir .
Tüm kullanım durumları için uygun değildir, ancak gerçek kullanım durumum için iyi çalıştı (bir birim test için veri sağlayan ve yeni bir birim testin dönüş değerinde olmayan bazı dahili durumlara erişilmesi gereken bir işlev).