Từ bất biến không có nghĩa là nhiều thứ không thay đổi trong một số điều kiện nhất định. Có rất nhiều loại bất biến khác nhau. Ví dụ trong vật lý, tốc độ ánh sáng là bất biến theo biến đổi lorentz, tức là nó không thay đổi nếu bạn chuyển sang khung tham chiếu. Trong lập trình có nhiều loại bất biến nữa. Có những bất biến đẳng cấp không thay đổi trong suốt vòng đời của một đối tượng, những bất biến phương pháp mà không thay đổi trong suốt vòng đời của một hàm, ...
Một bất biến đẳng cấp là cái gì đó luôn luôn (ít nhất là ở công khai quan sát được) lần) đúng trong một thể hiện của lớp đó.
Điều này hoàn toàn không liên quan đến co-/contra-variance. Co-/Contra-variance mô tả các kiểu có thể được thay thế cho các kiểu khác với các tham số (kiểu) chung hoặc các kiểu trả về khác nhau. Trong khi bạn có thể gọi một cái gì đó bất biến bởi vì nó không hỗ trợ Co-/Contra-variance, đây là một loại bất biến hoàn toàn khác với một lớp hoặc phương thức bất biến.
Ví dụ một số loại bộ sưu tập có thể có những bất biến sau:
- dữ liệu!= Null
- Kích> = 0
- Công suất> = 0
- Kích < = Công suất
Với lớp này:
class MyCollection<T>
{
private T[] data;
private int size;
public MyCollection()
{
data=new T[4];
}
public int Size{get{return size;}}
public int Capacity{get{return data.Length;}}
[ContractInvariantMethod]
protected void ClassInvariant()
{
Contract.Invariant(data != null);
Contract.Invariant(Size >= 0);
Contract.Invariant(Capacity >= 0);
Contract.Invariant(Size < Capacity);
}
}
Hầu hết các lớp có một số bất biến, nhưng không phải tất cả mọi người thực thi chúng. .net 4 thêm một cách tốt đẹp để tài liệu và khẳng định chúng bằng cách sử dụng các hợp đồng mã.
Buồn cười bạn nói .NET invariance không liên quan đến các loại bất biến khác. Tôi không đồng ý, nhưng có lẽ đó là nơi tôi sai. Có lẽ loại bất biến không liên quan đến sự bất biến đẳng cấp và việc sử dụng thử nghiệm đơn vị, hoặc chỉ liên quan đến mức thô sơ. Nếu chúng ta định nghĩa "bất biến" đơn giản là "không thay đổi". Câu hỏi đặt ra là "Làm thế nào để bạn kiểm tra những thứ không thay đổi". Hoặc, là câu hỏi "Làm thế nào để bạn kiểm tra một loạt các giá trị hợp lệ"? –
@ P.Brian Có nhiều loại bất biến. Và loại phương sai là hoàn toàn không liên quan đến bất biến class. Tôi đã thêm một đoạn giới thiệu. – CodesInChaos
@ P.Brian Để xem làm thế nào để thực thi một bất biến lớp trong .net 4 xem "Lee" của câu trả lời. Nếu bạn làm điều đó (và chọn cài đặt trình biên dịch chính xác), mã của bạn sẽ được viết lại để nó kiểm tra bất biến ở phần cuối của bất kỳ phương thức công khai nào. – CodesInChaos