我沒有在C#爲什麼使用值類型和引用類型時,接口的行爲不同
interface IChangeable
{
void Change(params Int32[] array);
}
struct SomeValueType : IChangeable
{
private Int32 m_X;
public SomeValueType(int X)
{
m_X = X;
}
public void Change(params Int32[] array)
{
m_X = array[0];
}
public override string ToString()
{
return String.Format("Crt value of m_X: {0}", m_X);
}
}
而且在主下面的例子:
static void Main(String[] args)
{
SomeValueType someValueType = new SomeValueType(5);
Console.WriteLine(someValueType); // No boxing occured. It showed: 5
Object someRefType = someValueType; // Boxed
Console.WriteLine(someRefType); // Also Shows 5 (from heap)
someValueType.Change(2); // Change Value of x not o's
Console.WriteLine(someValueType + " " + someRefType); // 2 5
((SomeValueType)someRefType).Change(3); // Copies to a temp stack so no change ocuured in o
Console.WriteLine(someRefType); // 5
IChangeable itfStackChange = (IChangeable)someValueType;
itfStackChange.Change(7);
Console.WriteLine(someValueType); // Shows 2 and not 7 ... why?
IChangeable itfChange = (IChangeable)someRefType;
itfChange.Change(1); // Unboxes the value of o, making the value of x 1 boxes o again?
Console.WriteLine(someRefType); // Shows 1
}
現在我想知道當我這樣做會發生什麼:
IChangeable itfStackChange = (IChangeable)someValueType; //value was 2 and its still 2
itfStackChange.Change(7);
Console.WriteLine(someValueType);
但是,如果我改變結構的定義,類像:
class SomeValueType : IChangeable
它寫出7和不2.
所以,當我寫IChangeable itfStackChange =(IChangeable)someValueType; itfStackChange指向一個複製的someValueType值,我正在修改該複製的值? – Thanatos 2013-03-07 18:36:22
@Thanatos - 是的。 – Oded 2013-03-07 18:49:55
需要注意的是,如果一個存儲值類型,接口類型的變量,系統將創建一個新的堆對象實例並存儲到一個參考是非常重要的;那個新的實例會像引用類型一樣在很多方面表現出來,並且會展現出引用類型的語義。 – supercat 2013-03-07 22:38:18