Có vẻ như bạn có câu trả lời cho câu hỏi lớn của mình rồi. Nhưng chúng ta hãy xem xét điều này anyway.
Có cách nào để buộc từ khóa này hoạt động như một đối số ref không?
Có. Làm việc thông qua một cách hợp lý.
- Một lập luận ref làm cho một alias cho một biến.
- "này" không phải là một biến trong một loại tài liệu tham khảo
- "này" là một biến trong một loại giá trị
- do đó cách duy nhất để vượt qua một "ref này" là từ một phương pháp thể hiện của một loại giá trị .
Và thực tế đó là cách "điều này" được triển khai trong một loại giá trị đằng sau hậu trường. Khi bạn có một (thực hành tồi tệ nhất!không thực sự làm được điều này) có thể thay đổi kiểu giá trị:
struct S
{
private int x;
public void M()
{
this.x = 123;
}
}
...
S s = new S();
s.M();
Kể từ trường hợp của S được truyền theo giá trị thế nào là nó rằng M đột biến s? s phải được chuyển qua tham chiếu! Trong thực tế, mã chúng tôi tạo ra là cũng giống như khi bạn đã viết một cái gì đó như:
struct S
{
private int x;
public static void M(ref S THIS)
{
THIS.x = 123;
}
}
...
S s = new S();
S.M(ref s);
Nói tóm lại, một "này" trong một cấu trúc đã được thông qua như là một tham số ref, vì vậy không có vấn đề đi qua nó cùng lần nữa. Làm như vậy hầu như luôn là ý tưởng khủng khiếp nhưng nó là hợp pháp.
Nguồn
2010-04-16 06:16:50
Có, bạn hoàn toàn đúng. Nhưng tôi muốn lớp gốc giữ lại những thay đổi được thực hiện bởi Khách truy cập. Nếu tôi không chuyển qua ref, tôi sẽ chỉ sửa đổi các thuộc tính của bản sao * của? –
grefly
@grefly: Không nếu "this" là một lớp học. Miễn là bạn không "truy cập" cấu trúc tùy chỉnh (các loại giá trị), thì không bắt buộc phải có ref. –
Cảm ơn bạn, bạn chính xác! – grefly