2012-06-04 217 views
1

我被告知,當你將一個對象傳遞給一個方法時,它被「通過值」傳遞給 。我做了一個小測試,以檢查它:C#傳遞參數(值或參考)?

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

上面打印「999」的代碼,但我認爲該對象被複制到方法
我一直在說,如果你不使用「裁判「(或」out「)方法獲得對象的值

有人可以告訴我嗎?
感謝,
socksocket

+2

請參閱參數傳遞在C#中(http://www.yoda.arachsys.com/csharp/parameters.html) – SwDevMan81

+0

在這種情況下,它是一個構造函數,它是否有所作爲? – socksocket

+0

什麼是Point和Circle類型,你能提供一個聲明嗎? –

回答

3

假設Point被聲明爲類,而不是p本身被拷貝,則參考p被複制。所以它仍然是通過價值。您傳遞參考值。

說當Point p = new Point(1, 1);(如果點是引用類型),人們可能會認爲這是一個包含Point一個變量,但實際上它是一個包含到存儲在別處一Point引用的變量。

+0

哦,我現在明白了!謝謝 – socksocket

+0

@ Botz3000 - 你能舉一個「通過引用傳遞」的例子嗎? – Saul

+0

@Saul參數可以通過引用通過使用'ref'或'out'關鍵字來傳遞。儘管這很少需要。 – Botz3000

1

C#是通過按值 - 該基準值在正常情況下通過,即是。 (這意味着它是對同一對象的新引用)

1

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

+0

爲什麼我被低估了。 –

1

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

結構是值類型和類是參考類型

一般不同的是,一個引用類型生活在堆上,和一個值類型生活在線,即,無論它是你的變量或字段定義。

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

甲含有引用類型變量包含一個指針,或參考到別的地方在內存中的實際值駐留。

這有一個好處,先跟:

  • 值類型總是包含一個值
  • 引用類型可以包含引用,這意味着它們不引用到目前爲止的任何事

內部,參考類型實現爲指針,知道,知道分配如何變化的作品,也有其他的行爲模式:

  • 複製類型變量的內容到另一個變量,會將整個內容到新變量,使得兩者截然不同。換句話說,複製後,改變其中一個不會影響其它
  • 複製參考類型變量的內容到另一個變量,複製引用,這意味着你現在有兩個引用到相同的地方否則存儲實際數據。換句話說,在複製之後,更改一個參考中的數據也會影響另一個參考,但這僅僅是因爲您只是在兩個地方查看相同的數據

當您聲明變量或字段,這裏的兩種類型之間的區別:

  • 變量:堆棧生命上值類型,引用類型生命堆棧作爲指針以在堆存儲器上的某個地方,其中實際存儲器住
  • 類/ struct-field:值類型住在該類中,引用類型住在類內部,作爲指向實際內存所在的堆內存某處的指針。

MSDNtutorial類似於您圓/點/軸系實例。