Kiến thức của tôi this
trong một phương thức mở rộng được chuyển thành biến số ref
. Tôi có thể xác minh điều này bằng cách thực hiệnPhương pháp mở rộng và biến 'biến này' cục bộ
public static void Method<T>(this List<T> list)
{
list.Add(default(T));
}
List<int> ints = new List<int>(new int[] { 1, 2, 3, 4, 5 });
ints.Method();
My List<int> ints
hiện là 1, 2, 3, 4, 5, 0
.
Tuy nhiên khi tôi làm
public static void Method<T>(this List<T> list, Func<T, bool> predicate)
{
list = list.Where(predicate).ToList();
}
List<int> ints = new List<int>(new int[] { 1, 2, 3, 4, 5 });
ints.Method(i => i > 2);
Tôi mong chờ của tôi List<int> ints
là 3, 4, 5
nhưng vẫn còn nguyên. Tôi có thiếu một cái gì đó hiển nhiên?
'list' không thông qua tham khảo, đó là một tài liệu tham khảo thông qua giá trị. Đi qua bí danh tham chiếu biến trong phương thức gọi bên trong callee cho phép bạn gán trực tiếp cho nó. – Lee
Có sự khác biệt giữa "tham chiếu * bằng * tham chiếu" và "truyền * tham chiếu * a". Tham chiếu đến danh sách được truyền theo giá trị, có nghĩa là bạn có thể truy cập và sửa đổi danh sách, nhưng bạn không chạm vào biến ở bên ngoài cũng tham chiếu đến danh sách. –
'(danh sách mới()) Phương thức()' biên dịch => đối số không cần phải là biến ở tất cả => không giống 'ref'. –