Почему Строка не. Освободить константу?

Marge-массив, который представляет собой разные типы данных:

var arrayInt = [Int]()
arrayInt.append(6)
var testArray = ["a",true,3,"b"] as [Any]
testArray.append(someInt)

Выход:

["a", true, 3, "b", "hi", 3, [6]]
181
задан travis 3 February 2009 в 16:49
поделиться

3 ответа

Причина, которая static readonly используется вместо const, должна использовать с неуправляемым кодом, как обозначено Microsoft здесь в Общая Исходная Общеязыковая инфраструктура 2.0 Выпуска . Файл для взгляда на sscli20\clr\src\bcl\system\string.cs.

Пустые постоянные хранения значение пустой строки. Мы должны вызвать конструктора String так, чтобы компилятор не отмечал это как литерал.

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

я нашел эту информацию от эта удобная статья в CodeProject.

137
ответ дан Jeff Yates 4 November 2019 в 15:45
поделиться

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

, В первую очередь, const поля static участники ( не члены экземпляра ).

раздел Check 10.4 Констант спецификации языка C#.

Даже при том, что константы считают статическими участниками, объявление константы ни требуют, ни позволяет статический модификатор.

, Если public const участники статичны, нельзя было бы полагать, что константа создаст новый Объект.

, Учитывая это, следующие строки кода делают точно то же самое относительно создания нового Объекта.

public static readonly string Empty = "";
public const string Empty = "";

Вот примечание от Microsoft, которая объясняет различие между 2:

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

, Таким образом, я нахожу, что единственным вероятным ответом здесь является Jeff Yates.

23
ответ дан bruno conde 4 November 2019 в 15:45
поделиться

Этот ответ существует в исторических целях.

Первоначально:

, поскольку String класс и поэтому не может быть константа.

Расширенное Обсуждение:

Много полезного диалогового окна было выработано в проверке этого ответа, и вместо того, чтобы удалить его, это содержание воспроизводится непосредственно:

В.NET, (в отличие от этого, в Java) строка и Строка являются точно тем же. И да, у Вас могут быть константы строкового литерала в.NET †“DrJokepu 3 февраля '09 в 16:57

, Вы говорящий, что Класс не может иметь констант? †“StingyJack 3 февраля '09 в 16:58

Да, объекты должны использовать только для чтения. Только структуры могут сделать константы. Я думаю, когда Вы используете string вместо String, компилятор изменяет константу в только для чтения для Вас. Все, чтобы сделать с оставанием счастливым C программистов. †“Garry Shutler 3 февраля '09 в 16:59

tvanfosson просто объяснил это подробный. "X не может быть константа, потому что содержание Y является классом", было просто немного слишком контекстно-свободно ;) †“Leonidas 3 февраля '09 в 17:01

строка. Пустой статическое свойство, которое возвращает экземпляр Строкового класса, а именно, пустая строка, не сам строковый класс. †“tvanfosson 3 февраля '09 в 17:01

Пустой является экземпляром только для чтения (это не свойство) Строкового класса. †“senfo 3 февраля '09 в 17:02

Главное причинение вреда. Я все еще думаю, что я прав, но теперь я менее уверен. Сегодня вечером требуется исследование! †“Garry Shutler 3 февраля '09 в 17:07

пустая строка является экземпляром строкового класса. Пустой статическое поле (не свойство, я признаю ошибку) на Строковом классе. В основном различие между указателем и вещью это указывает на. Если бы это не было только для чтения, то мы могли бы измениться, которые инстанцируют поле Empty, относится к. †“tvanfosson 3 февраля '09 в 17:07

Garry, Вы не должны проводить исследование.Подумайте об этом. Строка является классом. Пустой экземпляр Строки. †“senfo 3 февраля '09 в 17:12

существует что-то, что я не вполне получаю: как же может статический конструктор Строкового класса создавать экземпляр Строкового класса? Не то, что своего рода "курица или яйцо" сценарий? †“DrJokepu 3 февраля '09 в 17:12 5

Этот ответ был бы корректен почти для любого другого класса, но Системы. Строка..NET делает большое специальное преобразование регистра производительности для строк, и один из них - то, что Вы, CAN имеет строковые константы, просто попробуйте его. В этом случае у Jeff Yates есть корректный ответ. †“Joel Mueller 3 февраля '09 в 19:25

, Как описано в В§7.18, константное выражение является выражением, которое может быть полностью оценено во время компиляции. Так как единственный способ создать ненулевое значение ссылочного типа кроме строки состоит в том, чтобы применить новый оператор, и так как новый оператор не разрешен в константном выражении, единственное возможное значение для констант ссылочных типов кроме строки является нулевым. Предыдущие два комментария были взяты непосредственно из спецификации языка C# и повторяют то, что упомянул Joel Mueller. †“senfo 4 февраля '09 в 15:05 5

0
ответ дан Kirk Woll 4 November 2019 в 15:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: