尽管“String”是引用类型,但在VB.NET中,如果我们将参数作为ByRef传递,我们只会得到使用引用类型的效果。因此,与C#不同,甚至VB.NET中的引用类型的默认行为类似于值类型。为什么会有这种差异?引用类型在VB.NET中的行为类似于值类型
回答
如果您试图理解VB.NET和C#.NET中的引用类型和值类型及其差异,以字符串为例,那么您会迷惑自己很大的时间。
正如David所说,字符串是引用类型,但它们是特殊的,即不可变的。这意味着一旦你在引用地址上创建了一个字符串,你就不能修改它们。如果你尝试这样做,那么.NET会将你修改过的字符串存储在不同的地址上,并开始指向新地址。旧地址将在一段时间内收集垃圾。
例如
string str = "new string"; //One address space
str = "modified" + str; //Different address and not same address as above
而且,当你通过引用传递一个字符串的方法及修改的方法的字符串,它实际上只是指向一个不同的参考,但它使你觉得实际参考值会更新。
我希望这可以澄清你的问题。
这有点误导 - 字符串*不是特殊的。这只是其他任何参考类型。 *任何*引用类型都可以书写,以便表现不变。你可能意思是说,但值得强调,因为这不是大多数初学者很容易理解的。 –
是的,这就是我的意思,但没有提到“任何引用类型都可以写成它的行为不可改变”,只是为了避免混淆。我还提到“特殊”,因为在.net给出的所有类型中,只有字符串是一种不可变的类型(我认为我在做这个声明时是正确的)。当然,开发人员可以创建一个自定义的不可变类型,如果他/她想。无论如何感谢您指出。 :) – samar
不,System.String在C#中与VB.NET中的引用类型一样多。然而,它有点特别;它没有任何方法或属性,可让您更改字符串。
您只能分配一个字符串参考变量另一个字符串对象。它容易让程序员感到困惑,因为它的语法类似于你赋值类型值的方式;你很少使用新的运算符。你不必;分配文字不需要New。和System.String有很多方法,返回一个新的字符串对象;创建对象是在方法内部完成的。值得注意的是,使用Replace()方法并忘记使用返回值是一个非常常见的错误。
这种设计是非常有意的;它可以安全地将字符串作为方法参数传递,而不会有被调用的方法会改变它的风险。并自动生成一个字符串线程安全。这两个非常重要的属性,这种常见的类型。
它确实有一个显着的缺点;您的程序在使用字符串时往往会产生大量垃圾。因为他们很少活得很久。没关系;垃圾收集器是为了优化这种情况而编写的,并且它非常快速地执行第0代集合。 StringBuilder类是一个后备;它是可变的。
- 1. 引用类型.NET中的值类型
- 2. 使值类型的行为类似于使用装箱和隐式转换的引用类型
- 3. 字符串的行为类似于值类型
- 4. VB.NET值类型的“类”被转换为“类型”
- 5. c#值类型和引用类型
- 6. 引用类型与值类型
- 7. 值类型字段是引用类型?
- 8. 为什么字符串的行为类似于值类型,而使用==
- 9. 用户定义的值类型具有类似于本地值类型的类型转换
- 10. 如何分配引用类型类中的值类型属性?
- 11. 在C#中,使用的值类型与引用类型
- 12. Mono.Cecil类型引用类型?
- 13. 确定类型是引用类型还是值类型
- 14. 在VB.NET中强类型的字典类
- 15. 不能为索引类型为'String'的类型'[String:AnyObject]'下标值
- 16. 在Swift中是一个值类型或引用类型?
- 17. VB.NET弱类型?强类型的?
- 18. 类似于C++模板中的C#泛型类型演绎?
- 19. 在Java中用于联合类似类型的哈希码
- 20. 将值类型数组转换为引用类型数组
- 21. VB.NET指针值类型
- 22. 泛型类VB.NET
- 23. PHPUnit - 存根类似于构建类型
- 24. 对于引用类型和加载类型,IsSubClassOf的不同行为
- 25. Swift中的值类型和引用类型
- 26. javascript中的值类型引用类型对象
- 27. 更好地理解Swift中的引用类型和值类型
- 28. 对于引用类型
- 29. oop行为类似构造函数参数类型的类
- 30. 结构和类/值类型与引用类型
'字符串'以不同的方式实现:http://blogs.msdn.com/b/ericlippert/archive/2011/07/19/strings-immutability-and-persistence.aspx – Leri
http://msdn.microsoft .com/en-us/library/vstudio/362314fe.aspx –
你说的是不正确的。字符串是不可变的。它们仍然是引用类型,但由于您不能在创建字符串后修改字符串的内容,因此不能对其进行变异。 C#和VB.net在这个领域没有相关的不同。如果你展示你的代码让你得出你在这个问题中陈述的结论,那也许会更好。然后我们会有更多的上下文。 –