2013-09-28 46 views
2

與此代碼爲什麼:爲什麼循環正在創建具有相同地址的變量?

unsafe 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Double w = new Double(); 
      Console.WriteLine((IntPtr)(&w)); 
     } 
    } 

我一直都想與相同數量的?如何在循環中創建新變量?有了新的地址?

原因,爲什麼這對我來說是一個問題,我需要生成一個隨機雙數,然後我在兩個對象中使用一個指針(其中引用該雙)。在其中一個對象中,我正在更改此值,並且我希望它也在其他對象中更改:)

+3

「'i'」除了遞增之外沒有做任何事情;並且除了寫入(可能未初始化的)垃圾以外,你不用「'w」來做任何*。 –

+0

我猜這是一些編譯器優化。編譯器可能會告訴你沒有用'w'做任何事情,所以它不會每次都創建一個新的實例。 – Rohan

+2

@MichaelDautermann:你的分析的後半部分是不正確的。爲什麼地址是垃圾? –

回答

2

看來你想要分享值的類型值的引用。因此,它可以通過進行包裝值類型爲引用類型

class Ref<T> 
{ 
    public T Value { get; set; } 
} 

也請參閱相關的問題:C# - Good and flexible way to pass value types by reference?

+0

完美,謝謝:) –

+0

一個單一元素的雙數組也可以工作。 –

+0

@EricLippert,當然,因爲[數組類型是派生自抽象基類型數組的引用類型](http://msdn.microsoft.com/zh-cn/library/vstudio/9b9dty7d.aspx)。 –

14

從邏輯上講,每次通過循環時都是一個新變量。但我希望你不會期望每次都有一個新的變量被分配到堆棧中!如果循環運行一百萬次呢?編譯器知道它可以重新使用存儲,並且它可以。

如果您想要十個不同的地址,請創建一個包含十個元素的數組,並將其固定到位,並獲取每個元素的地址。

+0

因此,如果他在循環外部聲明變量並在循環內部實例化它,他是否每次都會得到一個新地址(因爲編譯器沒有在棧上創建更多空間)? – Rohan

+0

是的,「但是我希望你不希望每次都有一個新的變量被分配到堆棧中!」這正是我需要做的,因爲我需要生成一個隨機雙數,然後我在兩個類中使用一個指針(引用該double)。在其中一個類中,我正在改變這個值,並且我希望它能夠在其他類中改變:) –

+3

@BenasRadzevicius聽起來你可能會使用C#錯誤。 –

相關問題