2009-06-05 35 views
7

này làm phiền tôi rất nhiều và tôi thấy tôi viết lỗi ngớ ngẩn khi kết hợp với Intellisense (VS 2008 Pro):Làm thế nào để vô hiệu hóa ngầm "này" trong C#?

class Foo 
{ 
    public Foo(bool isAction) 
    { 
     this.IsAction = IsAction; 
    } 

    public bool IsAction { get; private set; } 
} 

Bạn có bắt nó? Tôi chắc chắn không cho đến khi IsAction không bao giờ thay đổi, gây ra lỗi.

Intellisense bằng cách nào đó chuyển đổi "isA<tab>" thành "IsAction" đối với tôi có nghĩa là tài sản Foo.IsActionluôn giả không phụ thuộc vào đầu vào constructor. Chỉ rực rỡ thôi.

Tôi phải nói rằng tôi đặc biệt ghét "ngụ ý this" (Tôi không biết nếu có tên chính thức) và tôi muốn tắt nó đi để nó không bao giờ giả định nó. Có cách nào để thực hiện việc này không? Điều này cũng áp dụng trong việc gọi các phương thức tĩnh của cùng một lớp.

Ngoài ra, quy ước đặt tên nào tránh được vấn đề nhỏ này? Thuộc tính phải giữ nguyên "IsAction" do đó nó phải là một quy ước về tên tham số hàm tạo. Thật kỳ lạ, nếu tôi đặt tên cho nó với chính tả khớp chính xác thì this.IsAction = IsAction; sẽ hoạt động chính xác.

Sự cố không phải là ngôn ngữ nhạy cảm với chữ hoa, mà là nhân chứng của this. Bây giờ tôi nghĩ về nó, điều này cũng nhiều hơn một câu hỏi VS 2008 Pro hơn một C#. Tôi có thể sống với mã đã được viết mà không this nhưng tôi không muốn viết mã mới mà không có nó có nghĩa là nói Trong


câu trả lời Noldorin của tôi đã suy nghĩ.

Bây giờ tôi nghĩ về nó, điều này cũng nhiều hơn một câu hỏi VS 2008 so với C#. Tôi có thể sống với mã đã được viết mà không có this (mặc dù tôi thay đổi nó nếu tôi đang ở đó mucking xung quanh) nhưng tôi không muốn viết mã mới mà không có nó có nghĩa là nói với Intellisense ngừng làm việc đó. Tôi có thể yêu cầu Intellisense loại bỏ nó không?

+0

Đây không phải là vấn đề của nhân chứng này. Thậm chí nếu bạn có thể tắt nó đi (tôi nghĩ bạn không thể), tôi chắc chắn bạn sẽ bật lại sau vài phút. –

+0

Tôi khá chắc chắn tôi sẽ không. Tôi đã đề cập đến tôi * ghét * nó? :) –

+0

Tôi rất thích nhìn thấy mã của bạn mà không có nó, mọi cuộc gọi đến một phương pháp riêng tư hoặc được bảo vệ trước bởi "này" ... Các lớp học tốt chứa nhiều phương pháp tái cấu trúc và biểu cảm nhỏ để đạt được mục tiêu của họ. Bạn sẽ được lấp đầy với "điều này" trên khắp nơi. –

Trả lời

3

Đây là vấn đề thường gặp. Microsoft có một số recommendations for parameter names nhưng chúng không hữu ích trong trường hợp của bạn.

Khi người trả lời khác đã đề cập, bạn không thể "tắt" hành vi phân giải phạm vi ngôn ngữ C# - cách tiếp cận tốt nhất của bạn là quy ước đặt tên. Những người khác đã đề cập đến ký hiệu "Hungary" - một số người có phản ứng đầu gối với điều này vì số confusion over the original intent của ký hiệu.

Cách tiếp cận cá nhân của tôi, đã sử dụng ký tự 'p' làm tiền tố cho tên thông số của các chức năng công khai.Nó không phô trương, đơn giản, dễ nhận biết và dễ thực thi với các công cụ như Resharper.

Quy ước đặt tên cụ thể mà bạn chọn là vấn đề về sở thích và kiểu dáng; tuy nhiên, có một số lợi ích từ việc nhất quán trong thực tế bạn chọn.

Sử dụng quy ước đặt tên đề nghị của tôi, bạn sẽ viết constructor của bạn để:

class Foo 
{ 
    public Foo(bool pIsAction) 
    { 
     this.IsAction = pIsAction; 
    } 

    public bool IsAction { get; private set; } 
} 
+2

Tên thông số là một phần của giao diện, hiển thị với người gọi. Bạn có thể tìm thấy một quy ước cho các trường thành viên sẽ tốt hơn. – Richard

4

Bạn luôn có thể quay lại ký pháp Hungari [Tôi đang chuẩn bị để được flamed khi tôi gõ này]. Nếu bạn có thể đối phó với sự xấu xa, nó sẽ giải quyết vấn đề của bạn. Đây là một gợi ý, không phải là một sự gợi ý.

Cách khác, tôi khá gosh darned chắc chắn rằng phân tích mã tĩnh sẽ bắt này và cảnh báo bạn về nó. Hãy thử FxCop.

EDIT

tôi đã được sử dụng Resharper trong hơn một năm nay, và tôi biết rằng nó là rất thông minh về việc hỗ trợ bạn trong một cách nhạy cảm như vậy. Trong số các lợi ích khác, vấn đề intellisense của bạn sẽ được giải quyết bằng cách cài đặt Resharper.

EDIT 2

tôi chỉ kiểm tra. Cả FxCop và Resharper đều không phát hiện lỗi này trực tiếp. Những gì cả hai bắt là thực tế là tham số isAction không được sử dụng trong phương pháp Foo. Trong trường hợp này, cảnh báo sẽ dẫn bạn đến sai lầm. Trong trường hợp tham số được sử dụng theo cách khác trong phương thức, nó có thể trượt qua phân tích mã tĩnh.

+0

Tôi biết sự kiện ông đề cập đến ký pháp Hungary (mặc dù tôi đã không khuyên bạn nên nó) sẽ gợi ra downvotes. :) –

+0

Có, nhưng đề nghị phân tích mã tĩnh nhận được +1 từ tôi ... nó sẽ bắt được điều này :-) –

+0

Xin vui lòng, không có ký hiệu Hungary! Tôi không chắc chắn lý do tại sao bạn đã đề cập đến nó nếu bạn không khuyên bạn nên nó. – Noldorin

1

Điều này giúp tôi luôn luôn.Tôi đã thực hiện để biến prepending được thông qua vào các nhà xây dựng với một '_', như:

class Foo 
{  
    public Foo(bool _isAction) 
    { 
     this.IsAction = _isAction; 
    } 
    public bool IsAction { get; private set; }} 
+3

Thông thường, dấu gạch dưới được dành riêng để chỉ một biến mẫu, không phải là tham số. Sử dụng nó để chỉ ra một tham số nên được tốt, nhưng có thể gây phiền toái cho các nhà phát triển không quen thuộc với quy ước của bạn. –

+0

Nếu tôi không thực hiện các thuộc tính tự động thì tôi đặt tên thuộc tính là "IsAction" và trường ủng hộ "_IsAction" để quy ước sẽ không hoạt động đối với các thuộc tính đó. :) –

+5

Tôi đã từng thấy điều đó trước đó, nhưng nó thật khủng khiếp. Đó là một thực hành có thể chấp nhận để đặt tên cho các trường riêng (và thậm chí được sử dụng bởi Microsoft vào các thời điểm), nhưng chắc chắn không phải cho các tham số. – Noldorin

1

Tôi sợ không có cách nào để vô hiệu hóa "tiềm ẩn this" tính năng. Đó là một phần của đặc tả ngôn ngữ và trình biên dịch, và không có cách nào để tắt nó đi.

Cá nhân tôi không coi đây là vấn đề lớn. Phải thừa nhận rằng, điều quan trọng là phải cẩn thận với cách viết hoa của tên thành viên và tên tham số, nhưng điều này luôn luôn là tình huống trong một ngôn ngữ nhạy cảm như C#.

"Giải pháp" được đề xuất của tôi (mà bạn đã làm) là luôn sử dụng từ khóa this để tham chiếu thuộc tính/trường, để nó ngay lập tức nổi bật khi bạn sử dụng tham số. Nó sẽ không giải quyết vấn đề cho bạn, nhưng nếu bạn giữ nó trong tâm trí nó chắc chắn sẽ giúp đỡ. Chỉ cần nhận được trong thói quen này (cũng như ghi nhớ tất cả các tên biến thông số/địa phương nên bắt đầu với trường hợp thấp hơn) sẽ làm bạn tốt để tránh vấn đề này trong tương lai.

+0

Tôi sẽ bình luận nhưng tôi sẽ sửa đổi câu hỏi của tôi thay vì ở đây trong một giây. –

+0

Vì vậy, bạn muốn vô hiệu hóa các đề xuất intellisense cho tất cả * thuộc tính * theo như tôi hiểu? Tôi khá chắc chắn điều này là không thể, nhưng tôi sẽ có một suy nghĩ về nó. – Noldorin

+0

Tôi muốn nó không kéo trong các thành viên lớp tiềm ẩn, cụ thể là ví dụ, nhưng tĩnh sẽ là tốt quá. –

0

Đó là một vấn đề gây phiền nhiễu trong IntelliSense của Visual Studio. Resharper làm cho nó phù hợp với hầu hết thời gian.

0

Tôi nghĩ rằng nhiều khả năng nhà phát triển đã chọn "Hành động" thay vì "isAction" từ Intellisense. Tôi không nghĩ Intellisense sẽ thay đổi "isA" thành "this.IsAction".

Nếu tên chỉ khác nhau theo từng trường hợp thì tôi nghĩ cách duy nhất để ngăn ngừa những sai lầm như thế này là bằng cách nhận thức chúng và cẩn thận, và bằng cách sử dụng các bài kiểm tra đơn vị một cách hiệu quả.

+0

Có, bởi vì trong trường hợp này, nó sẽ mặc định cho trường hợp cụ thể hơn (ví dụ: đối số isAction) trong VS intellisense mặc định. đây là lỗi của người dùng ;-) –

+0

Nếu bạn bị lỗi thì lỗi xuất phát từ lỗi nhà phát triển. Nói một lỗi nhà phát triển gây ra lỗi là không cần thiết và không hữu ích cho câu hỏi của tôi một chút. Tôi đang tìm cách cắt giảm các lỗi đó để tránh lỗi. –

+0

Điều này sẽ hoạt động trong C#;). Và cũng có thể, tài sản nên luôn luôn bắt đầu bằng một chữ cái viết hoa (thậm chí phân tích mã sẽ cho bạn biết rằng nếu tôi đúng). Cũng vậy với các chức năng trong mã của bạn ... nó luôn luôn bắt đầu bằng một chữ cái viết hoa. – Nordes

0

Điều này có thể gây phiền toái cho các khả năng khác, nhưng bạn có thể tắt tùy chọn để Intellisense chọn trước thành viên được sử dụng gần đây nhất. Tôi nhận ra rằng sẽ không thực sự khắc phục vấn đề hoàn toàn nhưng nó có thể giúp ngăn chặn một số tab tình cờ khi bạn không thực sự chọn đúng mục.

2

FxCop sẽ khiếu nại về điều này vì thông số isAction không bao giờ được sử dụng. Cụ thể nó sẽ kéo quy tắc CA1801: ReviewUnusedParameters.

Cá nhân tôi luôn cảm thấy rằng trình biên dịch C# nên đưa ra cảnh báo về các tham số không sử dụng.

0

Lưu ý:

Nếu bạn đang sử dụng chia sẻ lại, bạn có một số phím tắt viết nhiều mã này cho bạn và tránh lỗi.

Bạn có thể tạo thuộc tính trước, sau đó nhấn Alt-Ins và chọn "tạo hàm tạo" hoặc bạn có thể thêm tham số "isAction" vào hàm tạo, nhấn Alt-Enter với dấu mũ trong parameterName và chọn hành động "Tạo và khởi tạo hành động tự động thuộc tính" từ trình đơn bật lên.

+0

Một yêu thích khác của tôi là khi bạn có các thành viên có tên dài. Tôi sử dụng intellisense để tìm IsAnotherActionThatIsVeryLong bằng cách gõ IAATIVL, và isAnotherActionThatIsVeryLong bằng cách gõ iAATIVL. Tôi không bao giờ biết tôi đã bỏ lỡ nó cho đến khi tôi có nó. –

6

Tôi vừa thử code của bạn trong Visual Studio 2008. Bật trong phân tích tĩnh xây dựng mang lại các lỗi sau:

Warning 3 CA1801 : Microsoft.Usage : Parameter 'isAction' of 'Foo.Foo(bool)' is never used. Remove the parameter or use it in the method body.

Đề xuất của tôi là bằng cách bật tính năng này, bạn sẽ thấy các lỗi như thế này sớm. Để kích hoạt tính năng chọn này từ menu ngữ cảnh trên dự án, sau đó chọn tab Phân tích mã và chọn "Bật phân tích mã trên bản dựng"

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