2010-04-15 62 views
5

有沒有辦法強制這個關鍵字充當ref參數?我想傳入一個修改對象上多個屬性的訪問者,但這只是想像一個值參數。使用ref關鍵字參數?

守則對象:

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

代碼在參觀者​​:

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

回答

10

既然你實際上並沒有改變什麼receiver是指沒有必要爲ref關鍵字。但是,如果情況確實如此,您將無法使this引用另一個實例。

爲了通過this作爲ref參數,你就需要把它寫這樣的:

Visit(ref this); 

該代碼將無法編譯:「不能通過‘<這>’作爲ref或出因爲它是隻讀的「

+0

是的,你完全正確。但我希望原始課程保留訪問者所做的更改。如果我沒有通過參考,那麼我是不是隻會修改的*副本*的屬性? – grefly 2010-04-15 16:25:32

+0

@grefly:如果「this」是一個類,則不會。假設你不「訪問」自定義結構(值類型),ref不是必需的。 – 2010-04-15 16:28:40

+0

謝謝,你完全正確! – grefly 2010-04-15 16:30:20

5

如果您的Visitor<T>是一個類,那麼您不需要ref關鍵字。

所有類內部信息,如果他們的方法

+0

這是正確的 - 我很抱歉,我不能標記爲答案。 – grefly 2010-04-15 16:30:39

0

你真的需要ref關鍵字改變自動改變?

如果您更改接收器實例 (例如, receiver = null;

否則

receiver.Property也沒有訪問ref關鍵字

4

這聽起來像你得到的回答你的更大的問題了。但是,無論如何我們都要考慮這一點。

有沒有辦法強制這個關鍵字充當ref參數?

是的。通過邏輯工作。

  • 一個REF參數使得一個可變一個別名
  • 「這個」不是引用類型
  • 變量「這」是一個值類型
  • 因此
  • 一個變量來傳遞「REF這個」的唯一方法是從一個值類型的實例方法。

而事實上這就是「this」是如何在幕後值類型中實現的。當你有一個(最壞的做法!沒有真正做到這一點),可變的值類型:

struct S 
{ 
    private int x; 
    public void M() 
    { 
     this.x = 123; 
    } 
} 
... 
S s = new S(); 
s.M(); 

由於S的實例按值傳遞它是如何的M變異S'必須通過引用傳遞!其實我們生成的代碼是一樣,如果你寫的東西,如:

struct S 
{ 
    private int x; 
    public static void M(ref S THIS) 
    { 
     THIS.x = 123; 
    } 
} 
... 
S s = new S(); 
S.M(ref s); 

總之,一個「本」中已經被作爲ref參數傳遞,所以沒有一起傳遞問題一個結構再次。這樣做幾乎總是一個可怕的想法,但它是合法的。