Nie, ale możesz użyć delegata (np. Action
) Jako alternatywy.
Zainspirowany częściowo odpowiedzią Robin R, gdy stanąłem przed sytuacją, w której myślałem, że chcę opcjonalnego parametru wyjściowego, zamiast tego użyłem Action
delegata. Pożyczałem jego przykładowy kod do modyfikacji w celu użycia Action<int>
w celu pokazania różnic i podobieństw:
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);
}
Ma to tę zaletę, że opcjonalna zmienna pojawia się w źródle jako normalna int (kompilator otacza ją klasą zamknięcia, a nie zawija ją jawnie w klasie zdefiniowanej przez użytkownika).
Zmienna wymaga jawnej inicjalizacji, ponieważ kompilator nie może założyć, że Action
zostanie wywołany przed zakończeniem wywołania funkcji.
Nie nadaje się do wszystkich przypadków użycia, ale działał dobrze w moim prawdziwym przypadku użycia (funkcja, która zapewnia dane do testu jednostkowego, a nowy test jednostkowy wymagał dostępu do niektórych stanów wewnętrznych nieobecnych w wartości zwracanej).