2010-04-15 33 views
5

Có cách nào để buộc từ khóa này hoạt động như một đối số ref không? Tôi muốn chuyển vào một khách truy cập để sửa đổi nhiều thuộc tính trên đối tượng, nhưng điều này chỉ muốn hoạt động như một tham số giá trị.Sử dụng tham số ref với từ khóa này?

Mã trong Object:

public void Accept(Visitor<MyObject> visitor) 
{ 
    visitor.Visit(this); 
} 

Mã ở khách:

public void Visit(ref Visitor<MyObject> receiver) 
{ 
    receiver.Property = new PropertyValue(); 
    receiver.Property2 = new PropertyValue(); 
} 

Trả lời

10

Vì bạn đang không thực sự thay đổi gì receiver đề cập đến không có nhu cầu sử dụng từ khóa ref. Tuy nhiên, nếu trường hợp đó xảy ra, bạn sẽ không thể thực hiện this tham chiếu đến một trường hợp khác.

Để vượt qua this như một tham số ref, bạn sẽ cần phải viết nó như thế này:

Visit(ref this); 

Đó là mã sẽ không biên dịch: "Không thể vượt qua '< này >' như một ref hoặc ra đối số vì đó là chỉ đọc "

+0

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

+0

@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. –

+0

Cảm ơn bạn, bạn chính xác! – grefly

5

Nếu Visitor<T> của bạn là một lớp, thì bạn không cần từ khóa ref.

Tất cả thông tin bên trong một lớp sẽ tự động thay đổi nếu chúng được thay đổi theo phương pháp

+0

Điều này đúng - Tôi xin lỗi tôi không thể đánh dấu cả hai là Câu trả lời. – grefly

0

Bạn có thực sự cần từ khóa ref không?

ref sẽ hữu ích nếu bạn thay đổi trường hợp người nhận ví dụ: receiver = null;

khác

receiver.Property có thể truy cập cũng không từ khóa ref

4

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.

Các vấn đề liên quan