1

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

4

2 回答 2

1

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

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

例如

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

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

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

于 2013-07-26T08:53:52.447 回答
1

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

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

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

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

于 2013-07-26T12:57:23.357 回答