【问题标题】:Reference types behaves like value type in VB.NET引用类型的行为类似于 VB.NET 中的值类型
【发布时间】:2013-07-26 10:13:04
【问题描述】:

尽管“String”是一个引用类型,但在VB.NET中,如果我们将参数作为ByRef传递,我们只能得到使用引用类型的效果。因此,与 C# 不同,VB.NET 中的引用类型在默认情况下也表现得像值类型。为什么会有这种差异?

【问题讨论】:

标签: .net string reference


【解决方案1】:

如果你试图以字符串为例来理解引用类型和值类型以及它们在 VB.NET 和 C#.NET 中的区别,那么你会很困惑。

正如大卫所说,字符串是引用类型,但它们是特殊的,即不可变的。这意味着一旦您在参考地址上创建了一个字符串,您就无法修改它们。如果您尝试这样做,那么 .NET 会将您修改后的字符串存储在不同的地址上并开始指向新地址。旧地址会在一段时间内被垃圾回收。

例如

string str = "new string"; //One address space
str = "modified" + str; //Different address and not same address as above

而且,当你通过引用传递一个字符串给一个方法,在方法中修改这个字符串时,实际上只是指向了不同的引用,但它会让你感觉实际的引用被更新了。

我希望这能澄清你的问题。

【讨论】:

  • 这有点误导——字符串不是特殊的。它只是任何其他引用类型。 任何 引用类型都可以写成不可变的。您可能是这个意思,但值得强调的是,这不是大多数初学者容易理解的东西。
  • 是的,这就是我的意思,但没有提到“可以编写任何引用类型,使其行为不变”只是为了避免混淆。我还提到了“特殊”,因为在.net 给出的所有类型中,只有字符串是不可变的类型(我认为我做出这个陈述是正确的)。是的,如果开发人员愿意,当然可以创建自定义的不可变类型。无论如何感谢您指出这一点。 :)
【解决方案2】:

不,System.String 在 C# 中的引用类型与在 VB.NET 中的引用类型一样多。然而,它有点特别;它没有 any 可以让您更改字符串的方法或属性。

你只能用另一个字符串对象来分配一个字符串引用变量。它往往会使程序员感到困惑,因为语法类似于您分配值类型值的方式;您很少使用 New 运算符。你不必;分配文字不需要 New。 System.String 有许多方法可以返回一个新的字符串对象;创建对象是在方法内部完成的。值得注意的是,使用 Replace() 方法而忘记使用返回值是一个很常见的错误。

这个设计是故意的;它可以安全地将字符串作为方法参数传递,而不会有任何被调用的方法会更改它的风险。并自动使字符串线程安全。对于这种常见类型,这两个属性都非常重要。

它确实有一个明显的缺点;您的程序在使用字符串时往往会产生大量垃圾。因为他们很少活很长时间。没关系;垃圾收集器是为了优化这种情况而编写的,它非常快速地执行第 0 代收集。 StringBuilder 类是一个后备类;它是可变的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多