2010-09-29 33 views
9

Tôi đã thấy quá nhiều mã C# và C++ trong đó quy ước đặt tên biến dường như yêu cầu người lập trình viết tên biến bằng cách sử dụng dấu gạch dưới trước văn bản của biến. ví dụ:tại sao C# và C++ sử dụng _ <variableName> quy ước mã hóa?

int? _countMoney; 

Lý do cơ bản hỗ trợ quy ước đó là gì?

Trả lời

23

Trong C# tôi thường có tiền tố là _ trường riêng tư nhưng không bao giờ biến cục bộ. Lý do đằng sau điều này là khi tôi cần một biến riêng, tôi gõ _ và Intellisense lọc danh sách và nó dễ tìm hơn. Bằng cách này, tôi cũng có thể phân biệt giữa riêng tư với các biến địa phương và tôi không còn cần phải nhập this.variablename cho các trường lớp học mà chỉ đơn giản là _variablename.

+0

cũng +1 cho tôi, ý tưởng chính là lọc các biến. – Lazer

+0

Tôi đã làm điều này lâu trước khi intellisense để phân biệt các biến thành viên. Đó là một ngày tiếp theo từ ngày C + + và MS sử dụng m_ cho biến thành viên –

+2

Nếu bạn không thể xác định liệu biến có phải là cục bộ hay không trong vòng vài giây xem xét phương pháp, không thể lập luận rằng phương pháp của bạn có thể quá phức tạp? Đối với Intellisense lọc, là viết mã phù hợp với một tính năng cụ thể của một IDE thực sự là một ý tưởng tốt? –

5

Đây chỉ là một cách dễ dàng để xác định các biến thành viên riêng tư.

4

Giống như tất cả các quy ước khác, việc tạo mã dễ hiểu hơn.

Tôi đã xem đây là quy ước cho các trường riêng tư - trong trường hợp đó, rất dễ thấy rằng một trường riêng tư đang được sử dụng.

Bạn có thể hỏi cùng một câu hỏi về hungarian notation.

+4

Joel đã viết một cách bảo vệ thú vị về ký hiệu hungarian: http://www.joelonsoftware.com/articles/Wrong.html –

+3

Chìa khóa đang sử dụng ký hiệu ** Ứng dụng Hungary ** chứ không phải ** Hệ thống Hungary **! – CaffGeek

+0

Trong khi tôi không phải là một người hâm mộ ký hiệu Hungary, nếu nó được sử dụng để mô tả giá trị của một biến, tôi nghĩ nó được chấp nhận hơn nhiều.Đó là khi mọi người sử dụng nó để biểu thị một cái gì đó giống như một loại biến mà tôi nghĩ rằng nó bị lạm dụng. Trong bài viết của Joel, anh ta nói về việc sử dụng tiền tố "us" để biểu thị "các chuỗi không an toàn". Tôi sẽ lập luận rằng trong một ngôn ngữ hiện đại, như C#, nếu bạn muốn sử dụng một tiền tố như thế, mã sẽ rõ ràng hơn nếu bạn mở rộng tiền tố "chúng tôi" thành "không an toàn". –

0

Đôi khi mọi người làm điều đó trong các biến thành viên để giúp phân biệt chúng với các biến cục bộ. Nếu bạn đang trực tiếp truy cập vào một biến gạch dưới, có thể bạn nên sử dụng một getter/setter để truy cập thay thế.

+0

Có gì sai với câu trả lời này? Tôi thấy điểm hoàn toàn hợp lệ. – Lazer

1

Giống như những người khác đã nói, quy ước đặt tên đó giúp phân biệt các biến thành viên của người dân địa phương. Điều này cho phép hai lợi thế lớn:

  • Giúp chọn ra những nơi mà nhà nước đối tượng đang được sửa đổi (quan trọng, ví dụ, đối với an toàn thread)
  • Ngăn chặn đặt tên cuộc đụng độ. Tôi có thể viết một constructor như:

    SomeObject(int foo, int bar) 
    { 
        _foo = foo; 
        _bar = bar; 
    } 
    

    Bằng cách đó, tôi không cần phải đặt tên cho các đối số new_foo hoặc một cái gì đó như thế.

+2

Trong C++ ít nhất, bạn có thể viết một hàm tạo như sau: 'SomeObject (int foo, int bar): foo (foo), bar (bar) {}', và điều "đúng" xảy ra. –

+2

@Oli: Điều đó không nhất thiết có nghĩa là bạn thực sự nên làm việc này ... – sbi

+0

Đúng. Đây là điều tôi đã học được trong C# ngày của tôi (nơi mà danh sách khởi tạo thành viên không được phép, IIRC). –

5

Bạn không nên sử dụng _ làm tiền tố trong C++. Tên bắt đầu bằng _ được dành riêng cho trình biên dịch.

Tiền tố phổ biến nhất là C++ là m_ (như trong 'thành viên)

Đối với C# của nó rất phổ biến để sử dụng _.

Tại trang web của tôi, nơi chúng tôi làm số tiền bằng nhau C++, C#, chúng tôi luôn luôn sử dụng m_ để phù hợp

+2

Không, trong tên C++ bắt đầu bằng _Uppercase được đặt trước. _lowercase là tốt. – Detmar

+7

@Detmar: Trên thực tế [nó phức tạp hơn thế] (http://stackoverflow.com/questions/3650623/trailing-underscores-for-member-variables-in-c/3651336#3651336), nhưng cả hai bạn vẫn có điểm. – sbi

+1

từ tiêu chuẩn "Mỗi tên bắt đầu bằng dấu gạch dưới được dành riêng cho việc triển khai để sử dụng làm tên trong không gian tên chung". Về lý thuyết, bạn có thể thoát khỏi nó, nhưng tại sao trượt cạnh? – pm100

5

Hướng dẫn Microsoft cho đặt tên thành viên xác định rằng bạn không sử dụng tiền tố cho các lĩnh vực.

Không sử dụng tiền tố cho tên trường. Ví dụ, không sử dụng g_ hoặc s_ để phân biệt các trường tĩnh và không tĩnh.

Bạn có thể đọc hướng dẫn của Microsoft về tên here. Điều này chỉ áp dụng cho C#, tất nhiên.

+0

nó vẫn là một thực tế rất phổ biến mà làm cho vô số ý nghĩa ... –

+1

Cá nhân tôi không thích thực hành sử dụng tiền tố. IDE của bạn nên làm cho nó rõ ràng cho bạn những gì một địa phương và những gì là một thành viên. Đây là, tất nhiên, theo sở thích cá nhân (hoặc các tiêu chuẩn mã hóa dự án của bạn), nhưng câu trả lời này nhận được +1 của tôi. – rmeador

+0

Đây là một trong số ít nguyên tắc tôi không đồng ý. Tôi sử dụng 'm_' và' s_' để phân biệt giữa trường mẫu và trường tĩnh. Điều này quan trọng với tôi vì bạn nên giả định rằng các trường tĩnh có thể được truy cập bởi nhiều luồng và vì vậy bạn nên cẩn thận để bảo vệ chống lại vấn đề luồng. Sử dụng các tiền tố theo cách này làm cho nó dễ dàng để xem trong nháy mắt nếu có bất kỳ điểm vấn đề. Công ước này được đề xuất bởi Jeffery Richter, người vừa tình cờ có tiếng nói trong việc phát triển hướng dẫn này. Anh ta phải mất điểm đặc biệt này :) –

0

Một cái gì đó tôi nhận thấy bởi các nhà phát triển Java trong Eclipse khi tôi đã phải làm công việc Java, họ sẽ không gạch dưới có vars. Lý do là? Các thành viên vars được mã hóa màu sắc trong IDE ... cảm thấy không cần phải làm điều đó để nói. Từ thói quen nó đến tự nhiên như tôi thấy nó dễ dàng để xác định vị trí một thành viên var trong IDE VS bằng cách một số cue thị giác ... và gạch dưới là nó vì nó khá phổ biến. Trong trường hợp hiếm hoi, bạn phải xem xét mã ở dạng rawest của nó ... văn bản ... những thứ đó giúp ích rất nhiều.

1

Tôi không thực sự chắc chắn lý do đằng sau quy ước này là gì. Cá nhân, tôi không quan tâm đến việc sử dụng bất kỳ loại tiền tố tên biến nào để biểu thị phạm vi của một biến, cũng như tôi không đặc biệt quan tâm đến việc sử dụng dấu gạch dưới trong việc đặt tên bất kỳ thứ gì. Có gì xấu về việc sử dụng từ khóa "này" và chấp nhận một quy ước của tên lạc đà thấp hơn cho các biến cá thể/thành viên riêng?

public void IncrementFoo() 
{ 
    this.foo += 1; 
} 

Chỉ có thêm 5 ký tự để nhập, nhưng rất rõ ràng. Nếu bạn đã sử dụng quy ước lạc đà thấp hơn cho các biến cá thể riêng của bạn, thì điều này sẽ cho bạn biết ngay rằng bạn đang truy cập một biến cá thể/thành viên riêng và bạn không cần sử dụng bất kỳ loại tiền tố nào để biểu thị nó .

0

Tiền tố _ là khá cần thiết trong VB.NET vì nó không phân biệt chữ hoa chữ thường. Chúng tôi viết mã trong cả C# và VB.NET, và vì lợi ích của mọi người, điều quan trọng là phải có các quy ước đặt tên giống nhau trong cả hai ngôn ngữ.

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