如何确定是复制还是引用值

本文关键字:引用 复制 何确定 | 更新日期: 2023-09-27 18:35:39

假设我们有一个像这样工作的程序:

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对象还是引用它?

如何确定是复制还是引用值

它只是一个示例,因此代码不会完美,但我的问题是在这种情况下,GetStorage() 方法是复制MainStorage对象还是引用它?

它创建对Storage实例的引用的副本。在这种情况下,PrintData 中的字段将引用内存中与您分配给 MainStorage 的实例相同的实例。

您可以通过检查类型是 class 还是 struct 来检查赋值是否具有引用语义。 如果是值类型 ( struct ),则副本将具有值复制语义。

在此示例中,它获取引用的副本,而不是对象本身。

类始终通过引用进行复制。结构和枚举按值复制,除非您在方法参数中使用关键字 ref

字符串是类的特殊情况,是不可变的(无法更改),每当您修改它时,引用都会指向表示结果的新对象,因此,它实际上是值的副本。