有人可以解释一下,当在值类型中定义引用类型时会发生什么.我写下面的代码:
namespace ClassInsideStruct
{
class ClassInsideStruct
{
static void Main(string[] args)
{
ValueType ObjVal = new ValueType(10);
ObjVal.Display();
ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
ObjValRef.Display();
Test(ObjVal, ObjValRef);
ObjVal.Display();
ObjValRef.Display();
Console.ReadKey();
}
private static void Test(ValueType v, ValueType.ReferenceType r)
{
v.SValue = 50;
r.RValue = 50;
}
}
struct ValueType
{
int StructNum;
ReferenceType ObjRef;
public ValueType(int i)
{
StructNum = i;
ObjRef = new ReferenceType(i);
}
public int SValue
{
get { return StructNum; }
set
{
StructNum = value;
ObjRef.RValue = value;
}
}
public void Display()
{
Console.WriteLine("ValueType: " + StructNum);
Console.Write("ReferenceType Inside ValueType Instance: ");
ObjRef.Display();
}
public class ReferenceType
{
int ClassNum;
public ReferenceType(int i)
{
ClassNum = i;
}
public void Display()
{
Console.WriteLine("Reference Type: " + ClassNum);
}
public int RValue
{
get { return ClassNum; }
set { ClassNum = value; }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
ValueType: 10 ReferenceType Inside ValueType Instance: Reference Type: 10 Reference Type: 10 ValueType: 10 ReferenceType Inside ValueType Instance: Reference Type: 50 Reference Type: 50
我很想知道,在调用方法之后Test(ObjVal, ObjValRef),如何将值ReferenceType更改为50,它位于ValueType其值不会更改的内部?
我不确定,但编译器可能会将代码分离到一个单独的类中,然后只强制执行所需的规则。当您使用值类型时,每次将值传递到方法时都会复制该值。对引用类型的引用将被复制,但它引用同一个对象。同一个引用对象将发生更改,而复制的值类型将发生更改。您传入的原件不会反映副本上的更改。