asp.net(C#)函數對象參數傳遞的問題

來源:互聯網
上載者:User

複製代碼 代碼如下:class Program
{
static void Main(string[] args)
{
TestClass objA = new TestClass();
objA.Name = "I am ObjA";

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

TestFun(objA);

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

Console.Read();
}

static void TestFun(TestClass obj)
{
obj.Name = "I am be modified in TestFun";
Console.WriteLine(String.Format("In TestFun:{0}", obj.Name));
}

public class TestClass
{
public string Name { get; set; }
}
}

將對象objA作為參數傳遞給函數TestFun,這時傳遞的是對象objA的引用,所以在函數內對objA的修改會直接應用到這個對象本身。在函數TestFun內修改了形參obj的Name屬性,所以在Main中再調用objA.Name時這個屬性值就變為在TestFun中修改後的值了。這一點很好理解,運行結果也就是:

如果我們換一種寫法: 複製代碼 代碼如下:class Program
{
static void Main(string[] args)
{
TestClass objA = new TestClass();
objA.Name = "I am ObjA";

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

TestFun(objA);

Console.WriteLine(String.Format("In Main:{0}", objA.Name));

Console.Read();
}

static void TestFun(TestClass obj)
{
TestClass objB = new TestClass();
obj = objB;
obj.Name = "I am ObjB";
Console.WriteLine(String.Format("In TestFun:{0}", obj.Name));
}

public class TestClass
{
public string Name { get; set; }
}
}

那結果又將如何呢? 在TestFun中新建立了一個對象objB,接著將obj指向新建立的對象objB並對其的Name屬性賦值,所以在TestFun函數體裡Console.WriteLine的時候obj.Name應該是“I am ObjB”。那在Main裡調用了TestFun(objA)後objA指向的對象到底做了改變沒有,它仍舊指向原來的對象還是已經指向了在TestFun裡建立的objB呢?

我的猜測是這樣的,將objA傳遞給TestFun傳遞的實際是objA的地址,在調用TestFun之前的對應關係是:

objA是個變數,他本身的地址是000001,它存放的是objA對象的地址00E001。當調用函數TestFun(objA)時,由於要將objA作為參數傳遞給TestFun,所以在
棧中就複製一個objA地址的副本,這個副本的地址為000003,他存放的仍舊是objA對象的地址00E001,

所以在TestFun函數中,一開始obj指向的還是objA對象。當在TestFun中建立了一個對象objB後,記憶體模型變為:

TestFun中執行“obj=objB”後,obj指向objB對象,如:

所以執行完TestFun函數後,Main函數中objA仍舊指向原來的objA對象,故運行結果如下:

:本文中的記憶體模型僅是個人猜測,肯定有不正確或者不嚴謹的地方,希望不要誤導大家,也歡迎指正。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.