Различают строковый литерал из строки C # - PullRequest
0 голосов
/ 16 октября 2010

Я хочу сделать что-то вроде

IsItAStringLiteral("yes")
var v = "no";
IsItAStringLiteral(v)

С очевидным возвращаемым значением.Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 16 октября 2010

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

Простая причина: литералы, строковые переменные, интернированные строки всех видов ... каждый из них является ссылкой на систему.Строка.И все строки при передаче по значению загружаются в стек перед вызовом функции, который их использует (и, таким образом, не связаны с именем любой переменной, которая на них ссылается).К тому времени, когда функция вызывается, литерал и переменная выглядят совершенно одинаково и будут обрабатываться точно так же, когда передаются по значению.может проверить адрес объекта.Если адрес находится в адресном пространстве сборки, он почти наверняка является некоторой константой.Но это ненадежно (так как строки с литералами выглядят так же, как литералы), крайне хакерское, безобразное и, прежде всего, ненужное для любых целей, о которых я могу думать.

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

2 голосов
/ 16 октября 2010

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

Конечно, это не поможет вам с вашим точным вопросом.Переменная 'v' будет ссылаться на строковый литерал, поэтому он также появится в пуле интернирования.Зачем вам такой функционал?

...