簡體   English   中英

將“ this”作為參數傳遞-C#

[英]Passing “this” as an argument - C#

我目前正在玩一些XNA東西,學習如何編寫AI。 無論如何,這是我的情況:類A有一個函數,該函數對類B的實例進行引用,對其進行一些處理,然后將其返回。 類B包含一個類A的實例,然后從中調用該函數。

代碼示例:

Class A
{
    B classB;

    public A()
    {
        classB = new B();
    }

    public void Act()
    {
        this = B.Do(ref this);
    }
}

Class B
{
    public A Do(ref A classA)
    {
        //Manipulate
        return classA;
    }
}

我嘗試傳遞一個成員級克隆..但這顯然不起作用,因為“ this”是只讀的。 我對此一無所知。 我真的被卡住了。 有人有什么想法嗎? 理想情況下,我確實希望避免將對象中的每個變量作為單獨的參數傳遞。

安迪。

類是引用類型,因此

Class B
{
    public void Do(A classA)
    {
        //Manipulate
    }
}

應該操縱對象的classA引用。 然后在A中

Class A
{
    B classB;

    public A()
    {
        classB = new B();
    }

    public void Act()
    {
        B.Do(this);
    }
}

注意:“這確實有副作用,您傳遞的A的引用不能設置為null(它只會將局部變量設置為null)”- JulianR

您的B.Do()方法通過使用ref和return來做到這一點(修改A)。 不需要修改classA。 而且因為您針對this目標,它還是無法工作。 您永遠不會分配給this ,這沒有任何意義。

所以簡單的答案是

class B
{
   void Do(A anA) { anA.PublicProp = 1; }
}

但是循環引用確實使它成為一個可疑的設計。

對象總是按引用而不是按值傳遞。 這就是為什么我們將C#中的類稱為引用類型。 如果您使用結構,則要小心,因為它們是值類型。 該結構的副本將被傳遞,而不是原始副本。 如果希望通過原始文檔,則必須添加ref關鍵字。 ref僅在您希望將對一個對象的引用替換為對另一對象的引用時才對對象有用。

// Manipulate中是否有特定的要求您將類引用作為ref傳遞? 以及為什么還要返回classA-如果使用ref開頭,這似乎是多余的。

只需刪除ref關鍵字即可。 如果要將參數更改為其他內容,則僅需要引用,如果只想操縱它,則不要使用引用。

我認為如果語言允許您將其更改為該語言,那將是不好的(難以理解),因此它不允許您嘗試使用。

您不能將“ ref”與“ this”一起使用。 為什么需要通過引用傳遞參數?

如果您的函數必須更改調用者引用的對象,則僅需要“ ref”參數。 如果您只需要操縱和/或更改參數的字段,則不需要ref參數。

為了更加清楚,整個事情都是針對簡單AI的行為(例如,EG追逐,后衛,逃避等)。 我想將整個AI實體傳遞給這些行為,以便可以使所有實體的行為保持獨立(類似於多個網頁的單個樣式表的排序)。 我想要傳遞整個對象的原因是,某些行為需要對象的某些部分,而某些行為則不需要。

至於我為什么要回來..我不太了解我是怎么做出這個決定的。 我將其刪除

非常感謝Derek E!

我只是測試了您說的內容,效果很好。

我的問題是,我在想,當我傳遞參數時,它克隆了它並對其進行了操作,就像(我認為..)那樣,它在PHP或VB中起作用(不記得我是哪個。被告知這樣做

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM