3

为什么我们需要 .NET 中的引用类型?

我只能想到一种情况,它支持在不同功能之间共享数据,因此可以优化存储。

除此之外我无法列举任何原因,为什么需要引用类型?

4

4 回答 4

28

为什么我们需要 .NET 中的引用类型?我只能想到一个原因:它支持数据共享,因此可以优化存储。

你已经回答了你自己的问题。你还需要一个比这更好的理由吗?

假设每次您想参考这本书The Hobbit时,您都必须复制整个文本。也就是说,与其说“前几天我在看书The Hobbit的时候……”,不如说“前几天我在看书In a hole in the ground there lived a hobbit... [all the text] ... Well thank goodness for that, said Bilbo, handing him the tobacco jar.的时候……”

现在假设每次您在程序中使用数据库,而不是引用数据库,您只需制作整个数据库的完整副本,每次您以任何方式使用它。你认为这样的程序有多快?

参考文献允许您通过使用标题而不是内容来编写谈论书籍的句子。引用类型允许您编写通过使用小引用而不是大量数据来操作对象的程序

于 2012-02-10T17:46:15.897 回答
10
class Node {
    Node parent;
}

尝试在没有引用类型的情况下实现它。会有多大?一根弦会有多大?数组?您需要在堆栈上保留多少空间用于:

string s = GetSomeString();

如何在不特定于一个调用路径的方法中使用任何数据?例如,多线程代码。

于 2012-02-10T17:42:20.000 回答
5

我能想到的三个原因。

  1. 您不希望每次需要将对象传递给方法或集合类型时都不断地复制它们。

  2. 遍历集合时,您可能希望使用新值修改原始对象。

  3. 有限的堆栈空间。

于 2012-02-10T17:42:27.133 回答
0

如果您查看 int、long、float 等值类型,您会发现最大的类型存储 8 个字节或 64 位。

但是,考虑一个列表或长值数组,在这种情况下,如果我们有一个包含 1000 个值的列表,那么最坏的情况将占用 8000 个字节。

现在,通过值传递 8000 字节将使我们的程序运行非常缓慢,因为将列表作为参数的函数现在必须将所有这些值复制到一个新列表中,这样我们就会浪费时间和空间。

这就是我们有引用类型的原因,因为如果我们传递该列表,那么我们就不会浪费时间和空间来复制该列表,因为我们传递了内存中列表的地址。

函数中的引用类型将在与您传递的列表相同的地址上工作,如果您想复制该列表,您可以手动进行。

通过使用引用类型,我们为程序节省了时间和空间,因为我们不必费心复制和保存我们传递的参数。

于 2021-02-14T17:38:47.043 回答