引用类型的行为类似于VB.NET中的值类型

时间:2013-07-26 08:16:24

标签: .net string reference

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

2 个答案:

答案 0 :(得分:1)

如果您尝试使用字符串作为示例来理解引用类型和值类型以及它们在VB.NET和C#.NET中的差异,那么您将会非常困惑。

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

例如

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

此外,当您通过引用方法传递字符串并修改方法中的字符串时,它实际上只是指向不同的引用,但它会让您感觉实际引用已更新。

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

答案 1 :(得分:1)

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

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

这种设计非常有意;它使得将字符串作为方法参数传递是安全的,而没有被调用方法将改变它的任何风险。并自动生成一个字符串线程安全。这种常见类型的两个非常重要的属性。

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