我没有在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