System.String является типом класса, но почему мы можем использовать его без создания экземпляра с ключевым словом New? - PullRequest
2 голосов
/ 04 сентября 2011

У меня вопрос по поводу класса строки. System.String - это тип класса, но почему мы можем использовать его без создания экземпляра с ключевым словом New?

Например:

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

Новое ключевое слово вообще не используется

Ответы [ 4 ]

3 голосов
/ 04 сентября 2011

Когда вы пишете

Dim s As String = "hello"

, вы просто назначаете ссылку.За кулисами компилятор генерирует код для создания экземпляра строкового объекта, который содержит "hello".Это создание, вероятно, происходит задолго до назначения, но полные детали этого являются другой историей.

Таким образом, приведенный выше код не создает объект.

Аналогично, в вашем примере:

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

объект не создан.Все, что происходит, это скопировать ссылку на существующий объект.

1 голос
/ 04 сентября 2011

Да, у компилятора есть несколько ярлыков, которые позволяют вам использовать строки без явного их создания.

Когда вы используете литеральную строку, она даже не создается при ее использовании, вместо этого все литеральные строки создаются, когдаприложение запускается, поэтому вы копируете только ссылку на уже существующую строку.

Ваш пример похож, вы не создаете новую строку, вы просто копируете ссылку на уже существующую строку.

1 голос
/ 04 сентября 2011

Вы не можете по-настоящему использовать его без создания экземпляров (с некоторыми оговорками, написанными ниже).Вы можете:

A) Скопировать string ссылку на другую string ссылку

или

B) Добавить string к значению Nothing.Это было добавлено, чтобы упростить использование строк.См., Например, C #: почему добавление нулевого значения в строку допустимо? , но оно должно быть таким же для VB.NET.

НО

C) В VB.NETВ C # есть большая разница: «внутренние» функции VB.NET считают Nothing эквивалентом «».Так Len(Nothing) = 0 и UCase(Nothing) = "".Методы класса string будут по-прежнему генерировать исключение, если они используются в Nothing (из Манипуляции строк и Nothing = String.Empty (Почему они равны?) )

Я добавлю, что строковые литералы (например, "Foo") предварительно собираются во время загрузки сборки, в которой они определены.Поэтому, если вы делаете

Dim aString As String = "A String"

, вы копируете ссылку на строковый объект, содержащий "A String" в aString.

0 голосов
/ 04 сентября 2011

Вы можете.

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

Также

string my string = "test";

, который создает новую строку со значением "test". То, о чем вы говорите, - это доступ к членам статического типа, таким как String.Format или String.Join.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...