System.String是一个类类型,但为什么我们可以使用它而不用New关键字实例化它?

时间:2011-09-03 20:27:09

标签: .net vb.net string

我对字符串类有疑问。 System.String是类类型,但为什么我们可以使用它而不使用New关键字对其进行实例化?

例如:

Dim CommandLineParameters As String = Microsoft.VisualBasic.Interaction.Command

根本没有使用新关键字

4 个答案:

答案 0 :(得分:3)

写作时

Dim s As String = "hello"

您只是指定一个参考。在幕后,编译器生成代码以实例化保存"hello"的字符串对象。该实例化很可能在作业发布之前很久就已经发生了,但其全部细节是另一个故事。

总之,上面的代码不会实例化对象。

同样,在你的例子中:

Dim CommandLineParameters As String = Microsoft.VisualBasic.Interaction.Command

没有对象被实例化。所有这一切都是复制对现有对象的引用。

答案 1 :(得分:1)

如果没有实例化,你就无法真正使用它(下面有一些注意事项)。你可以:

A)将string引用复制到另一个string引用

B)将string添加到Nothing值。添加此项是为了简化字符串的使用。例如,请参阅C#: Why is adding null to a string legal?,但对于VB.NET应该是相同的。

BUT

C)在VB.NET中,与C#有很大的不同:“内部”VB.NET函数认为Nothing等同于“”。所以Len(Nothing) = 0UCase(Nothing) = ""string类的方法如果在Nothing(来自String ManipulationNothing = String.Empty (Why are these equal?)

上使用,仍会引发异常

我将添加字符串文字(例如"Foo")在加载定义它们的程序集期间预先构建。所以,如果你这样做

Dim aString As String = "A String"

您正在做的是将包含"A String"的字符串对象的引用复制到aString

答案 2 :(得分:1)

是的,编译器有一些快捷方式,可以让你在没有明确创建字符串的情况下使用字符串。

当您使用文字字符串时,它甚至在您使用时都不会创建,而是在应用程序启动时创建所有文字字符串,因此您只复制已存在字符串的引用。

您的示例类似,您没有创建新字符串,只是复制已存在的字符串的引用。

答案 3 :(得分:-1)

你可以。

char[] chars = { 'w', 'o', 'r', 'd' };
string string1 = new string(chars);

另外

string my string = "test";

实例化为具有值“test”的新字符串 您所说的是访问静态类型成员,例如String.FormatString.Join