Подтвердить что ты не робот

Почему класс String не имеет конструктора без параметров?

int и object имеют конструктор без параметров. Почему бы не string?

4b9b3361

Ответ 1

Update:

Предоставить дополнительную информацию для вас.

У вас нет пустого конструктора с string, однако у вас есть String.Empty. Причина в том, что string является неизменным объектом, каждый экземпляр string, который вы изменяете, фактически создает новый string в памяти.

Например: string name = "";, хотя это пустой string, он все равно будет содержать около двадцати байтов. Где String.Empty будет содержать только четыре или восемь байтов. Поэтому, хотя они означают одно и то же, один более эффективен, чем другой.

Однако я считаю, что вы хотите, чтобы пустой конструктор выполнял манипуляции, которые чаще всего обрабатываются StringBuilder. Некоторое действительно приятное использование между ними можно найти здесь (определение производительности/использования производительности).

Некоторая дополнительная информация о string может быть найдена здесь. Они неизменяемы, поэтому содержимое не может быть изменено впоследствии.

Пример:

string first = "Greg "; // Creates string "first" in memory.
string last = "Arrigotti "; // Creates string "last" in memory.
string name = first + last; // Creates string "name" in memory.

Когда вы редактируете один из них, он просто создает целую новую string в памяти. Если вы ищете способ потенциально обработать данные пользователя в поле, где нет, например, промежуточного имени, пустая строка может содержать допустимое использование.

Надеемся, это укажет вам в правильном направлении.

Ответ 2

Потому что нет никакого смысла в этом.

string является неизменным. Создание пустой string просто бесполезно.

MSDN:

Строки неизменяемы - содержимое строкового объекта не может быть изменено после создания объекта, хотя синтаксис делает его таким, как будто вы можете это сделать.

Как отметил Джонатан Лоновский, для этого мы имеем string.Empty.

Ответ 3

Строки неизменяемы, поэтому new String() не имеет никакой цели. Что бы вы с ним сделали?

Ответ 4

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

Пример:

string s = "str"; // str was created in the memory.
s += "2"; // str2 was created in the memory.

Используйте StringBuilder, когда вы хотите манипулировать строкой (для чего вам нужен пустой ctor, не так ли?)

Ответ 5

Почему?

Было бы логично и логично представить конструктор без параметров для типа string, но он его не имеет.

Причина в том, что дизайнеры этого типа думали, что было бы гораздо лучше иметь string.Empty.

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

Есть некоторые технические причины, по которым ограничение использования string.Empty может быть хорошей идеей. Во-первых, все пустые строки считаются равными, хотя необязательно ReferenceEquals, поэтому наличие нескольких пустых строк, казалось бы, не имеет смысла. Во-вторых, вы говорите, что "у меня эти две, казалось бы, похожие вещи, но я придавал каждому другому смысл", возможно, вы пытаетесь решить проблему с помощью неправильного инструмента.

Там также есть некоторые варианты наличия предопределенного string.Empty. Всякий раз, когда вы ссылаетесь на него, вы ссылаетесь на один и тот же экземпляр объекта, как и на любое другое место, и, следовательно, у вас нет большого количества пустых (и идентичных) строковых объектов в памяти.

Но можно ли это сделать? Конечно.

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

Однако кто-то решил создать тип без него.

Ответ 6

И для этого уже существует определенная константа: String.Empty

Ответ 7

int - тип значения, и как таковой он должен иметь конструктор без параметров. Нет никакого мнения, которое можно сделать здесь.

object не имеет причин иметь ничего, кроме конструктора без параметров. Данных нет. Какие параметры вы ожидаете от этого? объекты, построенные с помощью безпараметрического конструктора, также имеют цель; они используются, например, как объекты для lock on. Это, однако, класс, поэтому ему не нужно иметь открытый конструктор без параметров, однако, поскольку он не нуждается в параметрах, возникает вопрос, хотите ли вы, чтобы его экземпляр был сконструирован вообще; Microsoft предпочла сделать его конкретным, а не абстрактным.

string - это класс, поэтому нет необходимости иметь конструктор без параметров. Команда, строящая ее, просто никогда не видела необходимости иметь ее. Можно было бы разумно использовать такой конструктор для создания пустой строки, но они решили разоблачить string.Empty (а также пустой литерал строки) как способ явно создать пустую строку. Эти опции улучшили ясность над конструктором без параметров.

Другим довольно значительным преимуществом string.Empty и пустой литеральной строки является то, что они могут повторно использовать один и тот же экземпляр строки. Поскольку строки неизменяемы, единственный способ наблюдать разницу между двумя различными ссылками на пустые строки - это использование ReferenceEquals (или a lock в экземпляре). Поскольку практически нет необходимости уходить с вашего пути, чтобы иметь разные ссылки на пустую строку, удаление конструктора без параметров исключает возможность эквивалентного, но более плохого метода построения пустой строки. В очень маловероятном случае, когда важно построить новый экземпляр строки, который является пустой строкой, пустой массив char может быть передан в соответствующую перегрузку конструктора, поэтому удаление конструктора без параметров без возможности удалить функциональность с конца пользователь; это просто заставляет вас уйти с вашего пути, чтобы сделать что-то действительно необычное, если вы хотите сделать что-то действительно необычное, что является признаком хорошего языкового дизайна.

Ответ 8

Если вы знаете, что строка является неизменной, ваш вопрос можно перефразировать следующим образом:

Почему я не могу инициировать нулевой объект?

Ответ:

Поскольку нет нулевого объекта:)