2008-09-19 39 views
5

Hãy nói rằng chúng tôi có tờ khai phương pháp sau đây:Các tham số tùy chọn VB.NET hoạt động như thế nào 'Dưới mui xe'? Họ có tuân thủ CLS không?

Public Function MyMethod(ByVal param1 As Integer, _ 
    Optional ByVal param2 As Integer = 0, _ 
    Optional ByVal param3 As Integer = 1) As Integer 

    Return param1 + param2 + param3 
End Function 

như thế nào VB.NET làm cho thông số tùy chọn làm việc trong giới hạn của CLR? Các tham số tùy chọn CLS-Compliant?

Trả lời

7

Thật thú vị, đây là phần C# đã biên dịch mã, thu được qua phản xạ.

public int MyMethod(int param1, 
        [Optional, DefaultParameterValue(0)] int param2, 
        [Optional, DefaultParameterValue(1)] int param3) 
{ 
    return ((param1 + param2) + param3); 
} 

Lưu ý thuộc tính tùy chọn và thông số mặc địnhValue. Hãy thử đặt chúng vào phương pháp C#. Bạn sẽ thấy rằng bạn vẫn được yêu cầu chuyển giá trị cho phương thức. Trong mã VB tuy nhiên, nó biến thành mặc định! Điều đó đang được nói, cá nhân tôi chưa bao giờ sử dụng Mặc định ngay cả trong mã VB. Nó cảm thấy như một hack. Phương pháp quá tải thực hiện các trick cho tôi.

Mặc định sẽ giúp mặc dù, khi giao dịch với Excel Interop, đó là một nỗi đau trong ass để sử dụng thẳng ra khỏi hộp trong C#.

+0

Điều đó khá thú vị ... Tôi đã không đưa nó trở lại C# trong Reflector; đoán tôi nên có! –

+0

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

6

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.)

Các vấn đề liên quan