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

时间:2014-12-30 23:27:17

标签: c# .net reference value-type reference-type

假设我们有一个类似的程序:

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

2 个答案:

答案 0 :(得分:3)

  

它只是一个例子,所以代码不会很完美,但我的问题是在这个例子中GetStorage()方法是否复制了MainStorage对象还是它引用了它?

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

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

答案 1 :(得分:0)

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

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

String是类的一个特例,是不可变的(不能更改),每当你修改它时,引用指向一个表示结果的新对象,因此,它是有效的值的副本。