2013-07-26 157 views
1

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

+1

'字符串'以不同的方式实现:http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx – Leri

+0

http://msdn.microsoft .com/en-us/library/vstudio/362314fe.aspx –

+2

你说的是不正确的。字符串是不可变的。它们仍然是引用类型,但由于您不能在创建字符串后修改字符串的内容,因此不能对其进行变异。 C#和VB.net在这个领域没有相关的不同。如果你展示你的代码让你得出你在这个问题中陈述的结论,那也许会更好。然后我们会有更多的上下文。 –

回答

1

如果您试图理解VB.NET和C#.NET中的引用类型和值类型及其差异,以字符串为例,那么您会迷惑自己很大的时间。

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

例如

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

而且,当你通过引用传递一个字符串的方法及修改的方法的字符串,它实际上只是指向一个不同的参考,但它使你觉得实际参考值会更新。

我希望这可以澄清你的问题。

+0

这有点误导 - 字符串*不是特殊的。这只是其他任何参考类型。 *任何*引用类型都可以书写,以便表现不变。你可能意思是说,但值得强调,因为这不是大多数初学者很容易理解的。 –

+0

是的,这就是我的意思,但没有提到“任何引用类型都可以写成它的行为不可改变”,只是为了避免混淆。我还提到“特殊”,因为在.net给出的所有类型中,只有字符串是一种不可变的类型(我认为我在做这个声明时是正确的)。当然,开发人员可以创建一个自定义的不可变类型,如果他/她想。无论如何感谢您指出。 :) – samar

1

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

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

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

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