2011-01-07 39 views
8

Khi viết một lớp trong C#, bạn nên đánh dấu tất cả các biến thành viên riêng tư là chỉ đọc riêng nếu chúng chỉ được gán cho hàm khởi tạo và không thể thay đổi ở đâu đó trong lớp học? Hay là quá mức này?C# class và readonly members

+0

Cảm ơn tất cả các nhận xét. Tôi sẽ đi trước và đánh dấu các thành viên của tôi là chỉ đọc. Chúc mừng. – Bobbo

Trả lời

10

Vâng, cá nhân tôi tin rằng đó là một ý tưởng hay. Tôi cố gắng giữ các loại bất biến khi có thể và khai báo biến là readonly là một số tốt bắt đầu cho điều đó. Nó không phải là tất cả và tất cả, tất nhiên - nếu biến đó là một cái gì đó có thể thay đổi (ví dụ: StringBuilder hoặc một mảng) thì nó thực sự không giúp ích gì nhiều. Tôi vẫn sẽ biến biến chỉ đọc thành mặc dù để làm cho nó rõ ràng là tôi không muốn thay đổi giá trị của biến đó - và để ngăn bản thân mình vô tình làm việc khác ở cùng một lớp, có thể là vài tháng hoặc nhiều năm sau đó.

+0

bạn là một guru trong cả Java và C#. Về cơ bản, đây là bản C# tương đương của câu hỏi Java này. http://stackoverflow.com/questions/137868/using-final-modifier-whenever-applicable-in-java Tôi tự hỏi tại sao cuộc thảo luận ở đây có vẻ phức tạp hơn nhiều so với Java. – RAY

+0

@RAY: Không, hãy nhớ rằng 'final' trong Java không chỉ áp dụng cho nhiều biến - đó là sự kết hợp của' readonly' và 'sealed' trong C# ... và nếu bạn bắt đầu hỏi mọi người có nên niêm phong hay không không, bạn sẽ thấy cuộc tranh luận nóng bỏng hơn ... –

+0

Đúng. Câu hỏi được liên kết đặc biệt hỏi về biến cục bộ và lớp (đối số và trường) mặc dù ... – RAY

4

Vâng, đó là những gì readonly chỉ định cụ thể. Nếu bạn đã biết (hoặc ít nhất có thể giả định) rằng bạn sẽ không gán nó ở bất kỳ nơi nào khác, thì đánh dấu nó là readonly là một ý tưởng hay. Xét cho cùng, việc xóa xóareadonly sẽ dễ dàng hơn sau đó.

0

Có - bạn sẽ không gặp phải vấn đề với giá trị của chúng được sửa đổi sau đó bởi một số mã được viết bởi nhà phát triển khác không biết rằng chúng phải là chỉ đọc.

1

Wow câu hỏi hay và câu hỏi nào hoàn toàn sẽ được trả lời bằng ý kiến. Ý kiến ​​của tôi là tôi luôn tạo thuộc tính cho biến. Một ví dụ là như sau.

private int _myInt; 
private int myInt {get{return _myInt;}} 
+4

Điều đó vẫn cho phép biến bị biến đổi trong lớp - nó không cho biết ý định của nhà phát triển * không * để biến đổi nó trong một số khác phương pháp. –

-1

Nếu tôi chỉ khởi tạo biến một lần và không bao giờ ghi vào đó, tôi sẽ làm cho nó trở thành const.

http://en.csharp-online.net/const,_static_and_readonly

+1

Bạn không thể làm cho nó const nếu giá trị sẽ không phải là một hằng số biên dịch-thời gian, hoặc nếu nó là một trường thể hiện. –

+0

Phải, tôi xem xét const hiệu quả hơn vì nó * là * biên dịch-thời gian.Nếu thành viên không thể là const, thì một lộ trình khác sẽ cần thiết như chỉ đọc. Nếu không, tôi sẽ làm cho nó const. –

+4

Ngay cả khi nó là loại phù hợp, nó vẫn có thể là một ý tưởng tồi để làm cho nó trở thành một const. Ví dụ, giả sử bạn có một trường int "VersionNumber". Do * not * làm cho một const, làm cho nó chỉ đọc. Số phiên bản là số lượng hợp lý * thay đổi theo thời gian * và do đó không * liên tục *. Chỉ sử dụng const cho những thứ mà * chưa bao giờ thay đổi và sẽ không bao giờ thay đổi *, giống như giá trị của pi hoặc số nguyên tử của khách hàng tiềm năng. –

0

chỉ đọc làm cho rất nhiều ý nghĩa trong tình huống mà bạn vượt qua một tài liệu tham khảo dịch vụ thông qua constructor, tức là

public class MyViewModel { private readonly MyContext context; public MyViewModel(MyContext context) { this.context = context; } }

Bạn rõ ràng là không muốn bối cảnh của bạn ghi đè với nhau, bởi vì bạn có thể có rất nhiều thứ phụ thuộc vào dịch vụ cụ thể đó trong lớp. Và nếu đó là tham số hàm tạo, điều đó thường có nghĩa là bạn RELY trên dịch vụ hoặc đối tượng cụ thể đó để tạo và giữ trạng thái hợp lệ của đối tượng. Vì vậy, chỉ đọc là một chỉ báo tốt về điều đó. Việc đặt riêng tư trên thuộc tính có nghĩa là bạn không thể thay đổi nó bên ngoài lớp, chỉ đọc là một ràng buộc thêm khiến cho mọi thứ trở nên an toàn và dễ hiểu hơn.