有人可以解释一下,在值类型中定义引用类型时会发生什么。 我写了以下代码:
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; }
}
}
}
}
哪个输出:
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
内,其值未更改?
答案 0 :(得分:2)
我不确定,但编译器可能会将代码分成单独的类,然后只执行所需的规则。使用值类型时,每次将值传递给方法时都会复制该值。将复制对引用类型的引用,但它引用同一对象。当复制的值类型将被更改时,将更改此相同的参考对象。您传入的原件不会反映副本上的更改。
答案 1 :(得分:2)
因为引用类型是引用类型,值类型是值类型。无论他们住在哪里。
并且值类型也没有改变,它也没有改变它所持有的Reference。 更改的参考类型(仔细阅读我的文字)。
即该地址的基础数据发生了变化。值类型保持的引用仍然相同。
答案 2 :(得分:1)
值内部值类型是引用,它不会更改。但是参考指出的价值可以很容易地改变。
答案 3 :(得分:1)
引用类型作为指针传递给方法,因此修改内容将修改内存中的相同位置。通过在调用堆栈上发送值将值类型传递给方法。
答案 4 :(得分:-1)
编程时,重要的是要理解调用带参数的方法暗示/ includes /与为这些参数赋值相同。加:
static void Main(string[] args)
{
ValueType ObjVal = new ValueType(10);
ObjVal.Display();
ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
ObjValRef.Display();
//call to Test(ObjVal, ObjValRef); replaced by the following 4 lines
ValueType v = ObjVal;
ReferenceType r = ObjValRef;
v.SValue = 50;
r.RValue = 50;
ObjVal.Display();
ObjValRef.Display();
Console.ReadKey();
}
应该与上面的例子给出相同的结果。当您声明 ValueType v = ObjVal; 时,您正在复制实际的struct对象,这意味着v是一个单独的对象。所以改变它成员的价值不会影响ObjVal。
然而, ReferenceType r = ObjValRef; 制作参考的副本。所以现在有两个引用, ObjValRef 和 r ,指向同一个对象。即调用 new ValueType.ReferenceType(10);
时创建的对象因此,当通过这两个引用中的任何一个更改对象指向的成员时,无论使用哪个指针执行更改,此对象都会更改。
哦,by by ..引用只是一个对象的地址。通常这是一个32位数字,但这会从语言变为语言,从处理器变为处理器。
并自行更改参考副本,例如 r = null; 不会影响“原始”引用ObjValRef,因为r是ObjValRef的副本,而不是ObjValRef本身。它看起来好像是一样的,因为它们都指向同一个对象。
您可以将实际物体视为一个地方(一个公园或一些着名建筑,也许是“白色山地公园”)以及指向这个地方的街道标志。可以有许多路牌指向同一个地方,但这并不意味着有很多“白山公园”。这是值类型和引用类型之间的区别。