Xem xét loại bất biến này:Hợp đồng mã: Tại sao một số bất biến không được xem xét bên ngoài lớp học?
public class Settings
{
public string Path { get; private set; }
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(Path != null);
}
public Settings(string path)
{
Contract.Requires(path != null);
Path = path;
}
}
Hai điều cần chú ý ở đây:
- Có một hợp đồng bất biến mà đảm bảo
Path
sở hữu có thể không bao giờ cónull
- Các nhà xây dựng sẽ kiểm tra giá trị
path
luận để tôn trọng bất hợp đồng trước đó
Tại thời điểm này, một cá thể Setting
không bao giờ có thể là thuộc tính null
Path
.
Bây giờ, nhìn vào kiểu này:
public class Program
{
private readonly string _path;
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(_path != null);
}
public Program(Settings settings)
{
Contract.Requires(settings != null);
_path = settings.Path;
} // <------ "CodeContracts: invariant unproven: _path != null"
}
Về cơ bản, nó có hợp đồng riêng của mình bất biến (trên _path
trường) mà không thể được thỏa mãn trong việc kiểm tra tĩnh (x bình luận ở trên). Đó có vẻ hơi lạ với tôi, vì nó dễ dàng để chứng minh điều đó:
settings
là bất biếnsettings.Path
không thể được null (vì Cài đặt có hợp đồng tương ứng bất biến)- nên bằng cách gán
settings.Path
để_path
,_path
không được rỗng
Tôi có bỏ sót điều gì ở đây không?
Có, họ thực hiện. Nếu không thì bất biến sẽ giúp ích rất ít. –