簡體   English   中英

對象行為

[英]Object Behaviour

任何人都可以解釋下面的代碼的行為。 下面代碼的輸出是字符串“str”,i的值是100。

但為什么會這樣呢? 設置對象c1 = null后,為什么不為null?

public class Class1
{
    public int i;
    public Class1()
    {
        i = 10;
    }    

    public string method1()
    {
        return "str";
    }
}

public class Class2
{
    public void method2(Class1 c1)
    {
        c1.i = 100;
        c1 = null;
    }
}

    void main()
    {
        Class1 c1 = new Class1();
        Class2 c2 = new Class2();
        c2.method2(c1);
        Response.Write(c1.method1());
        Response.Write(c1.i.ToString());
    }

當您調用method2(Class1 c1)您將向對象傳遞引用的副本,而不是對象本身(或對它的引用)。 設置c1 = null您將引用的副本設置為null,而不是對象。

您可以通過將方法簽名更改為此來獲得您期望的行為:

method2(ref Class1 c1)

在C#中,引用按值傳遞。 也就是說, method2接收對c1的引用值的副本。

method2設置中, c1 = null影響引用的本地副本。

有關詳細信息,請參閱此文章

這是一個傳遞引用/按值傳遞的東西。 Javaranch Camp網站故事:通過價值請詳細解釋。 我知道上面的鏈接是針對Java的,這是一個C#問題,但是同樣的事情發生了(除非使用了“ref”關鍵字)。

希望簡單編輯代碼可以告訴您原因:

public class Class1
{
    public int i;
    public Class1()
    {
        i = 10;
    }    

    public string method1()
    {
        return "str";
    }
}

public class Class2
{
    public void method2(Class1 myLocalReference)
    {
        myLocalReference.i = 100;
        myLocalReference = null;
    }
}

void main()
{
    Class1 c1 = new Class1();
    Class2 c2 = new Class2();
    c2.method2(c1);
    Response.Write(c1.method1());
    Response.Write(c1.i.ToString());
}

我認為這清楚地表明Class2.method2中使用的引用與main中使用的引用不同。 當在方法調用c2.method2(c1);用作參數時, c1在main中聲明c2.method2(c1); 對Class1實例的引用將復制到名為myLocalReference的新本地值中。 然后設置myLocalReference = null; 在method2中你會發現Response.Write(myLocalReference.method1()); Response.Write(myLocalReference.i.ToString()); 會適當地失敗。 當method2退出本地引用時, myLocalReference超出范圍,您將返回到存在c1引用的main,並且不會更改,以便后續的Response.Write方法成功。

暫無
暫無

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

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