Nếu lớp của đối tượng bạn đang đi qua đã được viết bởi bạn, sau đó bạn đang ở may mắn.
Hãy tự hỏi: nếu C# có tính năng const
, hoạt động nào trên đối tượng tôi sẽ bị cấm thông qua tham chiếu const
đối với lớp học của tôi?
Sau đó, xác định interface
để loại bỏ các hoạt động bị cấm.
Ví dụ:
class MyClass
{
public string GetSomething() { ... }
public void Clobber() { ... }
public int Thing { get { ... } set { ... } }
}
Các tương ứng "const" giao diện có thể là:
interface IConstMyClass
{
public string GetSomething() { ... }
public int Thing { get { ... } }
}
Bây giờ sửa đổi các lớp:
class MyClass : IConstMyClass
{
Bây giờ bạn có thể sử dụng IConstMyClass
nghĩa const MyClass
.
void MyMethod(int x, int y, IConstMyClass obj)
Lưu ý: sẽ có những người sẽ cho bạn biết rằng điều này là không đủ. Nếu MyMethod
quay lại MyClass
thì sao? Nhưng bỏ qua chúng. Cuối cùng người triển khai có thể sử dụng sự phản chiếu để có được xung quanh bất kỳ khía cạnh nào của hệ thống kiểu - see this amusing example.
Tùy chọn duy nhất để ngừng các cuộc tấn công phản chiếu là cách tiếp cận tầm thường: tạo một bản sao hoàn toàn bị ngắt kết nối.
Nguồn
2010-08-08 09:28:39
bản sao có thể có của [Tại sao tham số const không được phép trong C#] (http: // stackoverflow.com/questions/3263001/why-const-parameters-are-not-allowed-in-c) – Incognito
Câu hỏi đó hỏi tại sao tham số const không được phép. Câu hỏi của tôi hỏi liệu một tham số chỉ đọc có thể có trong C# hay không. Tôi không coi nó là một bản sao. – CJ7