Tôi sẽ cố gắng giải thích:
Tôi nghĩ rằng chúng ta hiểu làm thế nào các loại giá trị hoạt động phải không? Các loại giá trị là (int, long, struct, v.v.). Khi bạn gửi chúng đến một hàm mà không có lệnh ref, nó sẽ sao chép dữ liệu . Bất cứ điều gì bạn làm với dữ liệu đó trong hàm chỉ ảnh hưởng đến bản sao chứ không ảnh hưởng đến bản gốc. Lệnh ref gửi dữ liệu THỰC TẾ và mọi thay đổi sẽ ảnh hưởng đến dữ liệu bên ngoài chức năng.
Ok về phần khó hiểu, các loại tham khảo:
Cho phép tạo một kiểu tham chiếu:
List<string> someobject = new List<string>()
Khi bạn mới lên một số dự án , hai phần được tạo:
- Khối bộ nhớ chứa dữ liệu cho someobject .
- Một tham chiếu (con trỏ) đến khối dữ liệu đó.
Bây giờ khi bạn gửi một số đối tượng vào một phương thức mà không tham chiếu , nó sẽ sao chép con trỏ tham chiếu , KHÔNG phải dữ liệu. Vì vậy, bây giờ bạn có điều này:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Hai tham chiếu trỏ đến cùng một đối tượng. Nếu bạn sửa đổi một thuộc tính trên someobject bằng cách sử dụng Reference2, nó sẽ ảnh hưởng đến cùng một dữ liệu được chỉ ra bởi tham chiếu1 .
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Nếu bạn bỏ tham chiếu2 hoặc trỏ nó vào dữ liệu mới, nó sẽ không ảnh hưởng đến tham chiếu1 cũng như tham chiếu dữ liệu1 trỏ đến.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
Bây giờ điều gì xảy ra khi bạn gửi một số dự án bằng cách tham chiếu đến một phương thức? Các tài liệu tham khảo thực tế để SomeObject được gửi đến phương pháp này. Vì vậy, bây giờ bạn chỉ có một tham chiếu đến dữ liệu:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Nhưng điều này có nghĩa là gì? Nó hoạt động chính xác giống như gửi một số dự án không phải bằng ref ngoại trừ hai điều chính:
1) Khi bạn null tham chiếu bên trong phương thức, nó sẽ null tham chiếu bên ngoài phương thức.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Bây giờ bạn có thể trỏ tham chiếu đến một vị trí dữ liệu hoàn toàn khác và tham chiếu bên ngoài chức năng bây giờ sẽ trỏ đến vị trí dữ liệu mới.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
MyClass
đó sẽ là mộtclass
loại, tức là một loại tham chiếu. Trong trường hợp đó, đối tượng bạn vượt qua có thể được sửa đổi bằng cáchmyFunction
không córef
/out
từ khóa.myFunction
sẽ nhận được một tham chiếu mới trỏ đến cùng một đối tượng và nó có thể sửa đổi cùng một đối tượng đó theo ý muốn. Sự khác biệt màref
từ khóa sẽ tạo ra, sẽ làmyFunction
nhận được cùng một tham chiếu đến cùng một đối tượng. Điều đó chỉ quan trọng nếumyFunction
được thay đổi tham chiếu để trỏ đến một đối tượng khác .