假设我们有一个类似的程序:
namespace Example
{
class Program
{
static void Main(string[] args)
{
Storage MainStorage = new Storage();
PrintData Printer = new PrintData();
Printer.GetStorage(MainStorage);
}
}
class Storage
{
//Stores some data
}
class PrintData
{
Storage storage;
public void GetStorage(Storage storage)
{
this.storage = storage;
}
public void Print()
{
//Prints data
}
}
}
这只是一个例子,因此代码不会很完美,但我的问题是在这个例子中,GetStorage()
方法是否复制了MainStorage
对象,还是引用了它?
答案 0 :(得分:3)
它只是一个例子,所以代码不会很完美,但我的问题是在这个例子中
GetStorage()
方法是否复制了MainStorage
对象还是它引用了它?
它复制了对Storage
实例的引用。在这种情况下,PrintData
中的字段将引用内存中与您分配给MainStorage
的实例相同的实例。
您可以通过检查类型是class
还是struct
来检查赋值是否具有引用语义。如果它是值类型(struct
),则副本将具有值复制语义。
答案 1 :(得分:0)
在此示例中,它获取引用的副本,而不是对象本身。
始终通过引用复制类。除非在方法参数中使用关键字ref
,否则将按值复制结构和枚举。
String是类的一个特例,是不可变的(不能更改),每当你修改它时,引用指向一个表示结果的新对象,因此,它是有效的值的副本。