簡體   English   中英

C#傳遞參數(值或引用)?

[英]C# passing parameter (value or reference)?

有人告訴我,當您將對象傳遞給方法時,它是按“值”傳遞的。 我做了一點測試來檢查它:

Point p = new Point(1, 1);
Circle c = new Circle(p);
p.x = 999;
Console.WriteLine(c.p.x);

上面的代碼打印“ 999”,但我認為對象已復制到方法中
有人告訴我,如果您不使用“ ref”(或“ out”),則該方法將獲得值
對象。

有人可以告訴我嗎?
謝謝,
襪子

假設Point聲明為class,而不復制p本身,則復制對p引用 因此,它仍然通過價值傳遞。 您傳遞引用的值。

當說Point p = new Point(1, 1); (如果point是引用類型),則可能會認為它是一個包含Point的變量,但實際上它是一個包含對Point的引用的變量,該引用存儲在其他地方。

C#是按值傳遞-在正常情況下即傳遞參考值。 (這意味着它是對同一對象的新引用)

Point是結構,因此按值傳遞。

在.NET中,有兩類類型, 引用類型值類型

結構是值類型 ,類是引用類型

通常的不同之處在於, 引用類型駐留在堆上,而值類型駐留在內聯中,也就是說,無論它在何處定義了變量或字段。

包含值類型的變量包含整個值類型值。 對於結構,這意味着變量包含整個結構及其所有字段。

包含引用類型的變量包含指針或對實際值所在的內存中其他位置的引用

首先有一個好處:

  • 值類型始終包含一個值
  • 引用類型可以包含null引用,這意味着它們目前根本不引用任何內容

在內部, 引用類型被實現為指針,並且知道引用類型並知道變量分配如何工作,還有其他行為模式:

  • 值類型變量的內容復制到另一個變量中,然后將整個內容復制到新變量中,以使兩者截然不同。 換句話說,復制后,對一個所做的更改不會影響另一個
  • 引用類型變量的內容復制到另一個變量中,然后復制該引用,這意味着您現在在實際數據的其他存儲位置擁有兩個相同的引用。 換句話說,在復制之后,更改一個引用中的數據似乎也會影響另一個引用,但這僅僅是因為您實際上只是在兩個地方查看相同的數據

聲明變量或字段時,以下是兩種類型的區別:

  • 變量: 值類型駐留在堆棧上, 引用類型駐留在堆棧上,作為指向實際內存所在的堆內存中某處的指針
  • class / struct-field: 值類型位於類內部, 引用類型位於類內部,作為指向實際內存所在堆內存的指針。

請參見MSDN ,本教程類似於您的“圓/點/軸”示例。

暫無
暫無

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

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