2010-09-07 28 views
8

StyleCop có quy tắc về việc sử dụng "điều này". tiền tố để gọi các thành viên lớp (SA1101).C# StyleCop - Sử dụng "cái này". tiền tố cho các thành viên lớp cơ sở như các thành viên lớp hiện tại hay không?

Quy tắc này có đúng về thành viên (ví dụ: phương thức) của lớp được kế thừa từ lớp cơ sở của nó hay không.

Ví dụ:

class BaseClass 
{ 
    protected void F1() 
    { 
     ... 
    } 
}  

class ChildClass : BaseClass 
{ 
    protected void F2() 
    { 
     ... 
    } 

    protected void F3() 
    { 
     this.F2(); // This is correct acording to SA1101 

     // F1 is a member of base class and if I dont put this prefix, stylecop will not show any message. 
     this.F1(); // Is this correct? 
     F1();  // Or this? 
    } 
} 

Tôi biết đây là chỉ để có thể đọc tốt hơn.

+1

Vâng, đó là loại đã cố gắng ra khỏi StyleCop xuống danh sách ưu tiên của tôi, sau đó. –

+0

@Jon Hanna: Bạn có thể định cấu hình các quy tắc nào thực sự chạy. Tôi sẽ không giảm giá StyleCop cho đến khi bạn nhìn vào nó và quyết định quy tắc nào là quan trọng/hữu ích cho bạn. –

+0

@A.Karimi nó không phải là để dễ đọc, thực sự sử dụng ** cơ sở ** sẽ làm cho mã dễ đọc hơn, đó là để tránh lỗi. Tài liệu có mẫu và giải thích tốt http://stylecop.soyuz5.com/SA1100.html –

Trả lời

6

Các documentation for StyleCop Rule SA1101 thực sự đề cập đến điều này:

Vi phạm quy định này xảy ra bất cứ khi nào mã chứa một cuộc gọi đến một thành viên dụ của lớp địa phương hoặc một lớp cơ sở mà không bắt đầu bằng ' điều này.'.

(tự nhấn mạnh thêm). Vì vậy, có, quy tắc yêu cầu this. trên mọi quyền truy cập vào một thành viên thể hiện, bất kể thành viên đó có thuộc lớp địa phương hay được kế thừa từ một lớp cơ sở hay không.

+1

Cảm ơn, Thật thú vị! StyleCop sẽ không hiển thị bất kỳ thông báo nào khi bạn fogot "this". tiền tố cho các thành viên cơ sở. –

-3

Tôi thích sử dụng cơ sở. base.F1() cho trường hợp của bạn. Điều đó ngăn chặn vô tình tham chiếu biến cục bộ và là lời nhắc trực quan về nơi thành viên đến từ đó.

+0

Thật tuyệt nhưng trong trường hợp này, chúng ta sẽ gặp phải một quy tắc khác trong stylecop (SA1100: Cuộc gọi đến GetItem chỉ nên sử dụng tiền tố 'cơ sở'. nếu mục được khai báo ảo trong lớp cơ sở và ghi đè được định nghĩa trong lớp cục bộ. Nếu không, hãy gọi tiền tố với số này chứ không phải cơ sở) –

+0

Sử dụng “cơ sở” sẽ là thực tế tồi nếu nó không phải là phương thức cơ bản của phương pháp ảo hiện tại bạn đang gọi. Phương thức cơ sở có thể được thực hiện ảo và bạn (hoặc một người nào khác trong hệ thống phân cấp ở trên bạn) có thể muốn ghi đè nó, và sau đó cuộc gọi cơ sở của bạn sẽ gọi phương thức sai. – Timwi

+0

Đó thực sự là thực tế không tốt. Bạn chỉ nên sử dụng base để xác định rằng bạn muốn phương thức base * thay vì * một được định nghĩa trong lớp đó. Gọi nó ở bất cứ nơi nào khác hơn là trên một chuyến đi hoặc hider là dodgy lúc tốt nhất. Nó dễ bị lỗi và sẽ gây nhầm lẫn cho những người khác nhìn vào mã như họ sẽ giải thích nó như đang được sử dụng hợp lý và bị nhầm lẫn là tại sao họ không thể tìm thấy phương pháp over-ride hoặc hide. –

0

Tôi tin rằng đó là chính xác vì quy tắc giữ cho tất cả các phương thức bất kể chúng được xác định trên cơ sở hay không. Cá nhân tôi không phải là một fan hâm mộ lớn của quy tắc này vì vậy tôi chỉ vô hiệu hóa nó.

+0

Tôi đồng ý với bạn nhưng có ai hay bất cứ điều gì giống như stylecop giải thích về điều đó? –

5

Nếu bạn nghĩ về các quy tắc cho đối tượng thừa kế, mặc dù F1() là thực sự tuyên bố trên BaseClass nó được thừa hưởng bởi ChildClass nên nó là hợp lệ để gọi nó như this.F1(). Đây là những gì StyleCop đang yêu cầu bạn làm. Bằng cách bắt đầu cuộc gọi với this, nó trở nên rõ ràng rằng bạn đang gọi phương thức F1()dụ của phiên bản hiện tại của lớp.

Thực tế, gọi nó là F1() hoặc this.F1() thực sự đồng nghĩa, nhưng ý nghĩa/mục đích trở nên rõ ràng hơn khi sử dụng tiền tố this.

Bạn không nên sử dụng tiền tố base ở đây chút nào (mặc dù nó sẽ biên dịch) vì F1() không phải là ảo và bị ghi đè trong ChildClass. Lý do duy nhất để sử dụng tiền tố base là khi bạn đã ghi đè thành viên lớp cơ sở ảo và muốn gọi thành viên lớp cơ sở đó một cách rõ ràng từ bên trong thành viên ghi đè. Nếu bạn đã thực sự sử dụng tiền tố base mà không cần F1() là mọi thứ ảo sẽ thực sự hoạt động cho đến khi bạn thực hiện F1() ảo và thêm ghi đè vào ChildClass. Tại thời điểm đó, mọi cuộc gọi đến base.F1() sẽ tiếp tục gọi số BaseClass.F1() và không phải ghi đè mới trong ChildClass.

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