Trước hết, câu trả lời của Jon, Michael và Jared về cơ bản là chính xác nhưng tôi có thêm một vài điều tôi muốn thêm vào chúng.
Phương pháp "không tinh khiết" có nghĩa là gì?
Việc mô tả các phương pháp thuần túy dễ dàng hơn. Phương pháp "thuần túy" có các đặc điểm sau:
- Đầu ra của nó hoàn toàn được xác định bởi đầu vào; đầu ra của nó không phụ thuộc vào ngoại vi như thời gian trong ngày hoặc các bit trên đĩa cứng của bạn. Sản lượng của nó không phụ thuộc vào lịch sử của nó; gọi phương thức với một đối số đã cho hai lần sẽ cho kết quả tương tự.
- Phương pháp thuần túy không tạo ra đột biến quan sát được trên thế giới xung quanh nó. Một phương pháp thuần túy có thể chọn để biến đổi trạng thái riêng tư vì lợi ích của hiệu quả, nhưng một phương thức thuần túy không làm thay đổi một trường của đối số của nó.
Ví dụ: Math.Cos
là phương pháp thuần túy. Đầu ra của nó chỉ phụ thuộc vào đầu vào của nó, và đầu vào không bị thay đổi bởi cuộc gọi.
Phương pháp không tinh khiết là phương pháp không thuần khiết.
Một số mối nguy hiểm khi truyền các cấu trúc chỉ đọc để làm hỏng các phương pháp là gì?
Có hai điều cần lưu ý. Việc đầu tiên là một trong những chỉ ra bởi Jon, Michael và Jared, và đây là một trong những Resharper là cảnh báo bạn về. Khi bạn gọi một phương thức trên một cấu trúc, chúng tôi luôn chuyển một tham chiếu đến biến đó là bộ thu, trong trường hợp phương thức muốn biến đổi biến đó.
Vậy điều gì sẽ xảy ra nếu bạn gọi phương thức như vậy trên một giá trị chứ không phải là một biến? Trong trường hợp đó, chúng ta tạo một biến tạm thời, sao chép giá trị vào biến đó và chuyển một tham chiếu tới biến đó.
Biến chỉ đọc được coi là một giá trị, vì nó không thể bị đột biến bên ngoài hàm tạo. Vì vậy, chúng tôi đang sao chép biến này sang một biến khác và phương thức không tinh khiết có thể làm thay đổi bản sao, khi bạn dự định biến biến đó thành biến.
Đó là nguy cơ truyền một cấu trúc chỉ đọc như một máy thu . Ngoài ra còn có một nguy cơ đi qua một cấu trúc có chứa một trường chỉ đọc. Một cấu trúc có chứa một trường chỉ đọc là một thực tế phổ biến, nhưng về cơ bản nó viết một kiểm tra rằng hệ thống kiểu không có tiền để rút tiền mặt; "read-only-ness" của một biến cụ thể được xác định bởi chủ sở hữu của bộ nhớ. Một thể hiện của kiểu tham chiếu "sở hữu" bộ nhớ riêng của nó, nhưng một thể hiện của một kiểu giá trị thì không!
struct S
{
private readonly int x;
public S(int x) { this.x = x; }
public void Badness(ref S s)
{
Console.WriteLine(this.x);
s = new S(this.x + 1);
// This should be the same, right?
Console.WriteLine(this.x);
}
}
Một nghĩ rằng this.x
sẽ không thay đổi vì x là một lĩnh vực readonly và Badness
không phải là một nhà xây dựng. Nhưng ...
S s = new S(1);
s.Badness(ref s);
... thể hiện rõ sự sai lệch của điều đó. this
và s
tham chiếu đến cùng một biến và rằng biến số không chỉ đọc được!
http://www.minddriven.de/index.php/technology/dot-net/code-contracts/code-contracts-method-purity – siride