Trái ngược với niềm tin phổ biến, các tham số tùy chọn có vẻ tuân thủ CLS. (Tuy nhiên, kiểm tra chính của tôi cho điều này là đánh dấu toàn bộ hội đồng, lớp và phương pháp với thuộc tính CLSCompliant, được đặt thành True.)
Vậy điều này trông giống như thế nào trong MSIL?
.method public static int32 MyMethod(int32 param1,
[opt] int32 param2,
[opt] int32 param3) cil managed
{
.custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00)
.param [2] = int32(0x00000000)
.param [3] = int32(0x00000001)
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 MyMethod)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add.ovf
IL_0004: ldarg.2
IL_0005: add.ovf
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method Module1::MyMethod
Lưu ý dấu [opt] trên tham số - MSIL hỗ trợ điều này nguyên bản, không có bất kỳ dấu vết nào. (Không giống như sự hỗ trợ của MSIL đối với từ khóa tĩnh của VB, đó là một chủ đề khác hoàn toàn.)
Vì vậy, tại sao không có trong C#? Tôi không thể trả lời điều đó, khác với suy đoán của tôi rằng nó có thể được coi là thiếu nhu cầu. Sở thích của riêng tôi luôn là xác định các tham số, ngay cả khi chúng là tùy chọn - với tôi, mã trông sạch hơn và dễ đọc hơn. (Nếu có các tham số bị bỏ qua, tôi thường nhìn đầu tiên cho một quá tải phù hợp với chữ ký có thể nhìn thấy - chỉ sau khi tôi không tìm được thông số mà tôi nhận ra rằng tham số tùy chọn có liên quan.)
Nguồn
2008-09-19 17:55:42
Điều đó khá thú vị ... Tôi đã không đưa nó trở lại C# trong Reflector; đoán tôi nên có! –
Tôi không nghĩ rằng các giá trị tùy chọn giống như quá tải vì giá trị mặc định bạn phải cung cấp cho các tham số tùy chọn. bạn có thể giả mạo nó với quá tải nhưng nó không hoàn toàn giống nhau. IMHO. Đôi khi tôi chỉ sử dụng chúng. – chrissie1