Các thực tiễn tốt nhất được xem xét hiện tại liên quan đến từ khóa này là gì ở phía trước trường và các phương thức trong c #?


14

Trừ khi cần phân biệt giữa một biến và trường có cùng tên, tôi không bao giờ đặt this.trước một trường hoặc bất kỳ quyền truy cập thành viên nào trong C #. Tôi thấy điều này không khác gì với m_tiền tố đã từng phổ biến trong C ++ và nghĩ rằng nếu bạn thực sự cần xác định rằng đó là một thành viên, lớp của bạn quá lớn.

Tuy nhiên, có một số người trong văn phòng của tôi rất không đồng ý.

Điều gì được coi là thực hành tốt nhất hiện nay liên quan đến this.?

EDIT: Để làm rõ, tôi không bao giờ sử dụng m_và chỉ sử dụng this.khi thực sự cần thiết.


m_nghĩa là gì?
Thất vọngWithFormsDesigner

2
@Frustrated Rằng biến đó là một thành viên của lớp.
Michael Todd

Xin lỗi, tôi đã đưa ra giả định rằng không ai có thể nghĩ rằng tôi sử dụng ký hiệu Hungary. Tôi đã cố gắng nói rằng tôi nghĩ this.là gần như tồi tệ như m_.
Andy Lowry

3
Anh bạn, chỉ cần cài đặt và chạy StyleCop! Đây cũng chắc chắn là một bản sao của một câu hỏi SO.
Công việc

3
Đồng ý hoặc không đồng ý với nhóm của bạn là không cần thiết, Bạn vẫn cần sự nhất quán trong một nhóm. Đặc biệt là đội càng lớn càng nhận được nhiều thứ khác như miền tây hoang dã và bạn biết mọi người nói gì về các lập trình viên Cowboy. ;-)
Chris

Câu trả lời:


14

Theo hướng dẫn thiết kế Khung , khi đề cập đến các lĩnh vực công cộng hoặc được bảo vệ:

KHÔNG sử dụng tiền tố cho tên trường.

Ví dụ, m_là một tiền tố.

Vì vậy, việc công khai một lĩnh vực cho vay đối với việc sử dụng thistừ khóa như được giải thích trên MSDN

Để đủ điều kiện thành viên bị ẩn bởi các tên tương tự, ví dụ: Sao chép

public Employee(string name, string alias) 
{
   this.name = name;
   this.alias = alias;
}

Khi đề cập đến các lĩnh vực riêng tư, bạn có thể sử dụng m_nếu bạn muốn. Nhưng, đối với các lĩnh vực công cộng, tôi khuyên bạn nên làm theo các thực tiễn tốt nhất.

Cá nhân, tôi không thích dấu gạch dưới trong tên biến của mình. Tôi cũng cố gắng để được nhất quán. Vì vậy, this.name = name;là một quy tắc tốt để làm việc trong cả hai kịch bản công khai / riêng tư.


+1: Đây là những gì tôi đã đề cập đến trong câu trả lời của mình, nhưng câu trả lời của bạn mang tính mô tả hơn nhiều.
Joel Etherton

1
Đồng ý - Tôi đã thấy một số tình huống trong đó bạn có một tài sản, một thành viên và một biến cục bộ đều có cùng tên. Thuộc tính là Pascal (chữ cái đầu tiên được viết hoa) để lại cho bạn hai biến là Camel cased (chữ cái đầu tiên thấp hơn). Cách duy nhất để phân biệt là với "cái này." (được khuyến nghị) hoặc tiền tố (không được khuyến nghị). Tôi đã sử dụng cả hai và trong thực tế, từ khóa này giúp dễ theo dõi hơn (IMO).
Mayo

1
Điều thú vị với lời khuyên khung là nguồn CLR được đặt với m_tiền tố. Tôi nghĩ rằng '_' là một tiền tố tốt vì bạn không bao giờ lo lắng về các vấn đề stackoverflow từ lỗi chính tả
Chris S

@Chris S - Theo kinh nghiệm của tôi, Microsoft làm tốt bằng cách ghi lại và duy trì một "quy trình mã tiến hóa". Họ đã sử dụng nhiều thực hành mà bây giờ được coi là "thực hành xấu". Nhiều khả năng vì họ đã học được từ những sai lầm của họ. Điều này không có nghĩa là họ đã quay lại và thay đổi mã hiện tại vì nó không phải lúc nào cũng đáng nỗ lực. Chỉ cần chắc chắn làm theo các hướng dẫn mới nhất trong mã ứng dụng mới - không kế thừa.
P.Brian.Mackey

11

Trong nhóm của chúng tôi, chúng tôi đã áp dụng tiêu chuẩn sử dụng this.hoặc Me.vòng loại đối tượng trong các lớp lớn hơn để giúp các nhà phát triển cơ sở dễ dàng phân biệt phạm vi chính xác / tức thời của một biến chỉ bằng cách xem xét nó.

Code-khôn ngoan đó là một ảnh hưởng hoàn toàn không cần thiết, nhưng cuối cùng nó không chặn bất cứ thứ gì vì nó tạo ra cùng một mã MISL chính xác. Chúng tôi đã áp dụng nó chỉ vì nó giải quyết một vấn đề ngay lập tức mà chúng tôi đã phát hiện ra với một số đàn em. Ngoài ra, tôi không thấy nó hữu ích khi đưa nó vào.


Điểm tuyệt vời về các lập trình viên cơ sở.
Patrick Hughes

2
Không phải lớp học của bạn nhỏ hơn sao? Hay đây là một vấn đề di sản?
Tjaart

@Tjaart: Các lớp học lớn hoặc nhỏ như họ cần phải có. Ngay cả trong một lớp nhỏ, có thể dễ dàng quên phạm vi của một biến giống như nó xuất hiện trên màn hình.
Joel Etherton

1
Tại sao đàn em của bạn có vấn đề @JoelEtherton? Đàn em Python có một vấn đề ngược lại khi chúng quên tự thêm. để truy cập các biến riêng tư. Đừng để đàn em quên và làm xáo trộn hội nghị?
Tjaart

1
@Tjaart: Đôi khi. Họ có vấn đề vì họ là đàn em, và đôi khi họ không chú ý hoặc chưa có con mắt thực hành. Chúng tôi đã sử dụng kỹ thuật này như một biển chỉ dẫn hơn là một tiêu chuẩn hoặc quy ước. Nó thực sự rơi vào tình trạng không sử dụng ở đây vì bài đăng này bây giờ rằng tất cả các đàn em của chúng tôi đã quen với môi trường. Tôi tưởng tượng nếu chúng tôi thuê đàn em mới (không có khả năng sớm) nó có thể quay lại.
Joel Etherton

10

StyleCop sẽ thực thi việc sử dụng this.Vì vậy, nếu bạn coi đó là cách thực hành tốt nhất (mà tôi làm), thì sử dụng this.là cách thực hành tốt nhất.

Phong cách bạn áp dụng tùy thuộc vào bạn và các tiêu chuẩn mã hóa của riêng bạn, "tốt nhất" là bất cứ điều gì bạn xác định nó là. Chỉ cần kiên định. Sử dụng nó không nhất quán chỉ dẫn đến nhầm lẫn.

Lý do của tôi là việc sử dụng this.gọi ra thực tế là bạn đang tham chiếu các thuộc tính cá thể, vì vậy, ví dụ, nó giúp làm nổi bật thực tế là bạn đang biến đổi chúng (nếu bạn có this.x = ...), đó là điều bạn có thể muốn biết. Nó cũng nhấn mạnh một thực tế là bất cứ lúc nào bạn thấy this.phương thức của mình không bao giờ có thể tĩnh. Sử dụng một số quy ước như m_cũng sẽ làm điều này, nhưng đó là một nỗ lực thủ công, nếu bạn tạo m_một tĩnh hoặc tái cấu trúc một số phương thức để truyền giá trị từ bên ngoài lớp thì bạn phải nhớ thay đổi tên, nếu bạn đang sử dụng thissau đó trình biên dịch sẽ buộc bạn thực hiện thay đổi.

Đặt đơn giản là sử dụng thisdễ dàng hơn bởi vì nếu bạn hiểu sai, mã của bạn sẽ không được biên dịch, nếu bạn sử dụng m_thì đó là một nỗ lực thủ công và bạn không tận dụng các công cụ.


9
Và Resharper sẽ đề nghị loại bỏ "cái này.". Số dặm của bạn có thể thay đổi.
Carra

Hở? Resharper chưa bao giờ đề nghị điều đó với tôi. Có lẽ vì tôi có plugin StyleCop?
Jesse C. Choper

1
Đúng, cài đặt StyleCop sẽ tắt tùy chọn đó trong R #.
Steve

5

Một trong những điều tuyệt vời khi sử dụng m_là ngay khi bạn nhập mintellisense nhỏ sẽ cung cấp cho bạn một danh sách tất cả các biến riêng tư của bạn, cá nhân tôi nghĩ rằng đó là một ưu điểm của nó; Tôi cũng sẽ đi s_cho thống kê tư nhân và c_cho các hằng số tư nhân vì lý do tương tự. Đó là ký hiệu Hungary, nhưng theo nghĩa nó có nghĩa là vì nó thêm ý nghĩa hữu ích cho tên biến để bất kỳ lập trình viên nào khác có thể nói những điều về nó từ tên của nó có thể không hoàn toàn rõ ràng.

Tôi chắc chắn không đồng ý với việc không có bất kỳ cách phân biệt giữa các biến thành viên và không phải thành viên vì chúng khác nhau và khi tôi đọc mã nơi mọi người không làm gì để phân biệt thì thực sự khó đọc hơn. Sử dụng this.chỉ cảm thấy như nhiều tấm nồi hơi hơn là cần thiết. Nhưng thực sự đó là sở thích cá nhân, nếu bạn viết mã một cách trong một thời gian bạn sẽ nghĩ rằng điều đó đúng và mọi thứ khác đều sai. Điều duy nhất thực sự quan trọng nếu kế hoạch này lành mạnh là mọi người trong nhóm đều nhất quán.


4
Hoặc gõ this.và để intellisense giúp bạn.
Steve

1
@Steve Haigh: bạn đang thiếu điểm, anh ấy nói rằng anh ấy sẽ nhóm tất cả các loại thành viên khác nhau lại với nhau, vì danh sách được sắp xếp theo thứ tự abc, tất cả các m_ xuất hiện cùng nhau, tất cả các s_ cùng nhau, v.v.
gbjbaanb

2
việc sử dụng this.sẽ cung cấp cho bạn mọi thứ trong lớp mà không cần phải sử dụng đến các quy ước đặt tên đã lỗi thời. Tôi hiểu điểm của các chữ cái khác nhau, tôi chỉ không nghĩ rằng chúng là cần thiết. Nếu bạn có rất nhiều thuộc tính, hằng số vv trong một lớp mà bạn cần quy ước này thì thiết kế của bạn bị hỏng khá nhiều.
Steve

2
@Steve Haigh: Điều đó thật tuyệt vời trong thế giới lý thuyết, nơi mọi người trong nhóm là một lập trình viên tuyệt vời và tất cả họ chia lớp của họ thành những phần nhỏ bị cắn và tái cấu trúc tốt và có thời gian để suy nghĩ về thiết kế, v.v ... Theo kinh nghiệm của tôi, cuộc sống không khá qhite ra như thế. Nhưng tôi đồng ý trong một thế giới lý tưởng có lẽ bạn đúng.

@Steve: Nhập m_sẽ cho tôi một danh sách tất cả các biến thành viên. Nhập this.sẽ cho tôi một danh sách các biến thành viên và các hàm thành viên.
Sean

4

thislà rõ ràng. Đó là một dấu hiệu quang học bạn không thể bỏ lỡ.

Tôi hầu như luôn thích mã rõ ràng hơn mã ẩn. Đó là lý do tại sao tôi sử dụng thisthường xuyên. Tôi coi đó là một thực hành tốt nhất.


4

Tôi luôn luôn sử dụng "cái này". Lý do dựa trên hai sự thật đơn giản:

  • Đọc mã khó hơn viết mã.
  • Bạn đọc mã thường xuyên hơn bạn viết mã.

Việc sử dụng "cái này" làm cho nó khá rõ ràng đối với bất kỳ ai đang đọc (tức là không chỉ tác giả, mà có thể bao gồm cả tác giả trong 6 tháng sau khi các chi tiết cụ thể của việc triển khai đã hoàn toàn bị lãng quên) rằng có, đây là một thành viên trong lớp chúng tôi ' đang nói về đây "m_" và tương tự chỉ là một quy ước, và giống như bất kỳ quy ước nào khác, nó có thể bị sử dụng sai (hoặc hoàn toàn không được sử dụng) - không có gì để thực thi "m _" / etc tại cả thời gian biên dịch hoặc thời gian chạy. "cái này" mạnh hơn: bạn có thể đặt "m_" vào một biến cục bộ và trình biên dịch sẽ không phàn nàn; bạn không thể làm điều đó với "cái này".

Nếu bất cứ điều gì tôi cho là đáng tiếc rằng việc sử dụng "điều này" không bắt buộc trong thông số kỹ thuật ngôn ngữ.

Là một phần thưởng tuyệt vời, khi gỡ lỗi, bạn có thể di chuột qua (hoặc thêm một chiếc đồng hồ) "cái này" và kiểm tra tất cả các thành viên khác trong lớp - thông tin có giá trị.


3

Các thistừ khóa được sử dụng đặc biệt để phân biệt 2 biến đó tồn tại, đặc biệt là khi thực hiện bạn có một constructor hoặc phương pháp với một biến có cùng tên nhưng có thể có cùng một kiểu.

Thí dụ:

public class Example {

    string reason;
    string cause;

    Example (string reason, string cause) {
        this.reason = reason;
        this.cause = cause;
    }

    //<Setter> if you want to explicitly write your onw
    public void setReason(stirng reason) {
        this.reason = reason;
    }
}

Điều này (ví dụ this.reason = reason) về cơ bản gán giá trị từ các tham số cho các biến trong lớp. thisvề cơ bản lấy lớp reasontừ khối tham số.


2

Tôi cũng đã tự hỏi về điều đó một thời gian. Sau khi thực hiện một số mã hóa mở rộng trong javascript, tôi bắt gặp bản thân sử dụng this.mã c # thường xuyên hơn (trước đó tôi đã sử dụng nó gần như toàn diện trong các hàm tạo hoặc các phương thức tương tự để tránh sự mơ hồ). Nó làm cho mã rõ ràng hơn một chút với nỗ lực bổ sung, hơn nữa bạn không kết thúc việc tách tên thành viên lớp của mình bằng tiền tố và vẫn có thể quay lại sử dụng các thành viên 'con đường ngắn' khi ngữ cảnh rõ ràng hoặc trong các câu lệnh đặc biệt phức tạp. Tôi chỉ thêm this., khi tôi có một phương thức dài hơn, danh sách đối số dài hơn hoặc nhiều biến cục bộ được khai báo và tôi nghĩ rằng mã có thể thu lợi từ một số sự rõ ràng bổ sung, ngay cả khi nó bị ép buộc.

Nhưng cá nhân tôi hoàn toàn ghét m_kiểu tiền tố, không phải do tiếng Hungary, mà vì gạch dưới là một nỗi đau để gõ;) Vì vậy, tôi không coi đó là một sự thay thế. Tôi sẽ thừa nhận rằng nó có điểm mạnh khi nói đến intellisense, tuy nhiên bạn có thể một lần nữa lập luận rằng nếu bạn không thể nhớ một vài chữ cái đầu tiên của một biến thành viên, thì lớp của bạn sẽ rất lớn.


1

Tôi ưu tiên một tiền tố gạch dưới duy nhất cho các thành viên lớp. _someVar;

Tại sao? Ban đầu bạn biết rằng đó là một thành viên, không phải là một biến stack. Chỉ cần thuận tiện trong một cái nhìn nhanh chóng. Và nó mất ít lộn xộn hơn so với từ khóa "này".


1

Sử dụng những thứ như this.tiền tố / từ khóa không cần thiết cũng không thay đổi kết quả luôn mang tính chủ quan. Tuy nhiên, tôi nghĩ rằng chúng ta có thể đồng ý rằng hầu hết chúng ta muốn phân biệt các trường với các biến cục bộ. Một số sử dụng tiền tố gạch dưới (mà tôi thấy xấu và một loại ký hiệu Hungary), số khác sử dụng this.từ khóa. Tôi là một trong những người đến sau. Tất cả chỉ là về khả năng đọc và dễ hiểu. Tôi không bao giờ nhớ gõ thêm một chút nếu nó rõ ràng hơn hoặc dễ đọc hơn. Tôi muốn phân biệt các trường và các biến trong chớp mắt.

Tôi luôn xác định các trường có tên tương tự myFieldvà tên tham số và tên biến cục bộ cũng tương tự myField. Không có dấu gạch dưới, không có tiền tố. Tôi sử dụng thisở mọi nơi tôi đề cập đến một lĩnh vực. Bằng cách này, tôi có thể phân biệt các trường với các biến và đối số cục bộ mà không cần bất kỳ loại tiền tố nào. Tất nhiên, trong trường hợp như thế này, thistừ khóa là bắt buộc:

public Person(string firstName)
{
    this.firstName = firstName;
}

Do đó, các thuộc tính của tôi trông như thế này (vâng, tôi luôn đặt trường với thuộc tính và không ở đâu đó không liên quan ở đầu tệp của tôi):

private string firstName;
public string FirstName
{
    get { return this.firstName; }
}

Nó đọc độc đáo: trả lại tên này .


-2

EDIT: Câu trả lời của tôi rõ ràng không phải là một câu trả lời. Vì vậy, đây là một chỉnh sửa. Nguyên tắc mã hóa của Microsoft nêu rõ:

2.6 Đặt tên

Không sử dụng tiền tố cho các biến thành viên ( , m , s_, v.v.). Nếu bạn muốn phân biệt> giữa các biến cục bộ và biến thành viên, bạn nên sử dụng điều này., Trong C # và Cameron Me .iết trong VB.NET.

Có thể được tìm thấy tại: http://bloss.msdn.com/b/brada/archive/2005/01/26/361363.aspx

Vì vậy, có vẻ như ít nhất là từ MS không có hướng dẫn rõ ràng, mặc dù một câu trả lời khác nói rằng StyleCop biến nó thành một hướng dẫn. Không có thẩm quyền về những điều này, vì vậy tôi sẽ đề nghị bạn tự quyết định hoặc trong trường hợp này hãy nhượng bộ nhóm của bạn. Đó không phải là một vấn đề lớn.

Câu trả lời ban đầu của tôi, cá nhân tôi đồng ý với bạn, nhưng có lẽ một bài kiểm tra đọc hiểu đặt hai phương pháp này với nhau sẽ có giá trị. Nếu không, những thứ phong cách này chỉ là bùn.

Salvo của tôi phải tuân theo: Ý kiến ​​của tôi là mọi người đang làm phức tạp một cách không cần thiết kiểu mã của họ và nếu họ cần chỉ ra rằng một cái gì đó là một biến cấp độ lớp, có thể có một số vấn đề cấu trúc nghiêm trọng khác trong mã, như phương thức công thức cũ của đặt các biến riêng tư ở đầu lớp khiến bạn phải liên tục cuộn lên xuống.

điều này gây ấn tượng với tôi như là một trong những quy ước "cái này là gì" so với "quy ước đặt tên" chính xác. Brevity nên được ưa chuộng ở trên là rõ ràng. Đây là một bài học được lặp đi lặp lại thường xuyên bởi các ngôn ngữ động. Chúng tôi không cần tất cả các lông tơ!


1
-1. Thay vì trả lời câu hỏi, bạn chỉ đưa ra ý kiến ​​của mình mà không phản ánh các thực tiễn tốt nhất.
Arseni Mourzenko

Vì vậy, theo stylecop sử dụng này. là cách thực hành tốt nhất @MainMa. Tôi hoàn toàn không đồng ý. Tôi sẽ chỉnh sửa câu trả lời để lưu ý rằng.
Tjaart

@MainMa bây giờ tốt hơn chưa? Nhiều câu trả lời khác chỉ đưa ra ý kiến, nhưng không được đánh giá thấp. Các thực hành tốt nhất là gì và chúng được tìm thấy ở đâu?
Tjaart

-3

điều này. thường có thể dẫn đến tiếng ồn không mong muốn.

Đây là giải pháp của tôi:

  • tham số_names_
  • biến địa phương
  • MỌI THỨ
  • _private_members
  • NonPrivateProperies
  • _NonPrivateProperty // Người ủng hộ
  • tài sản cá nhân
  • _privateProperty // người ủng hộ

2
Điều này rất mâu thuẫn với phong cách .Net thông thường. lạc đà và pascal vỏ tất cả các cách thông qua. Phương pháp của bạn khá không nhất quán. Đây cũng là một quy tắc kiểu cũ đối với các hằng số capitilise và một quy tắc không được sử dụng trong cộng đồng .Net chung.
Tjaart

Tôi hy vọng bạn đặt một nhận xét ở đầu mỗi tệp giải thích sơ đồ đó cho người không quen biết ... ;-)
JaySeeAre

Tôi không hiểu làm thế nào bạn nghĩ thêm điều này. sẽ tạo ra tiếng ồn, nhưng tất cả những thứ vớ vẩn đó không
Travis Weston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.