Tidak, tetapi Anda dapat menggunakan delegasi (mis. Action
) Sebagai alternatif.
Terinspirasi sebagian oleh jawaban Robin R ketika menghadapi situasi di mana saya pikir saya ingin parameter opsional keluar, saya malah menggunakan Action
delegasi. Saya telah meminjam kode contohnya untuk dimodifikasi agar dapat digunakan Action<int>
untuk menunjukkan perbedaan dan persamaan:
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);
}
Ini memiliki keuntungan bahwa variabel opsional muncul di sumber sebagai int normal (kompiler membungkusnya dalam kelas penutupan, daripada kita membungkusnya secara eksplisit dalam kelas yang ditentukan pengguna).
Variabel perlu inisialisasi eksplisit karena kompiler tidak dapat berasumsi bahwa Action
akan dipanggil sebelum panggilan fungsi keluar.
Ini tidak cocok untuk semua kasus penggunaan, tetapi bekerja dengan baik untuk kasus penggunaan nyata saya (fungsi yang menyediakan data untuk tes unit, dan di mana tes unit baru membutuhkan akses ke beberapa keadaan internal yang tidak ada dalam nilai balik).