[英]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)
這是一個傳遞引用/按值傳遞的東西。 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.