Применение string.Empty
Зачем применять string.Empty , или в чем его отличие от «» ? И в том, и в другом случаях результат — пустая строка.
На MSDN про первый вариант сказано :
Значением данного поля является строка нулевой длины, «».
Т.е. то же самое «» .
Насколько знаю, Empty используется только со строками, и полностью повторяет «» , но ведь зачем-то его в язык ввели. Кто знает зачем?
В .NET2.0+ нет разницы (в плане оптимизации) какой вариант использовать для присваивания и сравнения. Какой считаете более уместным, тот и используйте.
Однако так как string.Empty — это readonly -поле, а «» — это константа, то в некоторых ситуациях можно использовать только «» :
В качестве значения по умолчанию параметра метода:
Error: Default parameter value for ‘value’ must be a compile-time constant
В case в switch :
Error: A constant value is expected.
В параметрах атрибута:
Error: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
Empty c что это
Это заметка о методах, которые C++ создаёт автоматически, даже если вы их не создавали.
Для кого эта заметка? Надеюсь, что она будет интересна начинающим программистам на С++. А опытным программистам позволит лишний раз освежить и систематизировать свои знания.
Итак, если вы написали
то, знайте, что на самом деле вы создали примерно вот такой класс:
Надо помнить, что эти функции создаются всегда, и могут приводить к неожиданным результатам.
К каким это может привести неприятностям?
Самое неприятное, когда программа работает, но не так как вы хотели. При этом никаких ошибок с точки зрения языка не возникает. Именно к таким неприятностям приводят неявно создаваемые методы.
Пример первый: Конструкторы
Рассмотрим класс, который выдаёт сообщения о создании/удалении объектов и поддерживает статический счётчик объектов (для простоты в виде публичного int).
Что будет делать такая программа?
Результат может удивить неподготовленного читателя:
Складывается ощущение, что объект был создан только один раз, а удалён — трижды. Счётчик объектов уходит в минус. При этом программа спокойно отрабатывает и нигде не валится.
Как вы понимаете, это произошло потому, что мы не учли автоматически созданный конструктор копирования, который только копирует, но ничего не печатает и не корректирует счётчик.
Мы можем исправить эту ситуацию, если сами допишем конструктор копирования
Теперь мы получим абсолютно разумный результат:
Аналогичные засады возникают при присвоении (operator=); но.
Пример второй: Получение адреса
… самые, пожалуй, изысканные подвохи могут возникать, если вы реализовали нетривиальный метод получения адреса
но забыли реализовать его двойник, обладающий теми же (или иными?) нетривиальными свойствами:
Пока ваша программа ограничивается не-константными объектами:
всё работает. Это может продолжаться очень долго, все уже позабудут, как устроен объект CC, проникнутся к нему доверием и не буду думать на него при появлении ошибок.
Но рано или поздно появится код:
Предательски не сработает (про перегрузку по const я уже писал вот тут).
Но хватит, наверно, примеров. Смысл у них у всех примерно один и тот-же. Как же избежать всех описанных неприятностей.
От этих недоразумений очень легко застраховаться!
Самый простой способ — создать прототипы всех методов, создаваемых автоматически и не создавать реализации.
Тогда программа просто не слинкуется и вы получите вполне разумное сообщение. Я получил такое:
Ваш компилятор может выразиться чуть-чуть иначе.
Если этот способ кажется вам корявым (у вас есть на то все основания и я с вами солидарен), то можно создать «полноценные» методы, но сделать их приватными.
Тогда вы тоже получите сообщения об ошибках ещё на этапе компиляции.
Согласитесь, что это сообщение выглядит как-то… поприличней.
Ну и третий способ (последний в списке, но не последний по значению) — просто честно реализовать все необходимые методы, не откладывая это дело в долгий ящик
String.Empty vs "" in C#
What is the difference between String.Empty and "" ?
Formal Difference
String.Empty is a static read-only field, while "" is constant.
Because of that, there are some restrictions on when you cannot use String.Empty .
Default parameter value
Case expression in switch statement
Attribute arguments
Under the hood
Let’s take a look at the IL code, generated for the following C# code.
The ldsfld operation pushes the value of a static field onto the evaluation stack, while the ldstr pushes an object reference to a new string object representing the specific string literal stored in the metadata.
And it seems the JIT compiler detects this ldsfld and injects the interned empty string instead.
The following declarations
At the disassembly
For each variable, the same memory address 1DC38553060h is moved into the register rcx .
Why is String.Empty not a const?
It is an interesting question, and here and here are some thoughts on it.
Outcome
Behind the scenes String.Empty works exactly same as "" . Both will give you pointer to the same interned value.
It is just a style matter of your choosing and not a performance-based decision. Go with whatever you find more readable, or whatever convention is already being used in your project.
Null Versus Empty Strings
The C language offers some delicious predicaments you may not find in other languages. Many of these odd situations involve variables, which are strongly typed in other languages. As a case in point, consider the difference between an empty string and a null string.
If you’ve only coded C, the question arises, “Aren’t an empty string and a null string the same thing?” They aren’t. In other programming languages, they’re definitely different.
A null string has no values. It’s an empty char array, one that hasn’t been assigned any elements. The string exists in memory, so it’s not a NULL pointer. It’s just absent any elements.
An empty string has a single element, the null character, ‘\0′ . That’s still a character, and the string has a length of zero, but it’s not the same as a null string, which has no characters at all.
The name array is null string. That doesn’t mean that it has a null character ( ‘\0′ ) at element zero. It means that name hasn’t been assigned a value. Had it been assigned a value, and the contents removed or replaced by a null character at element zero, then it becomes an empty string.
So how can you tell the difference between an empty string and a null string?
You must compare the two: Create an empty string or null string as a sample, then use the strcmp() function to compare them. A null string compares to another null string, and an empty string to an empty one.
Array empty[] at Line 6 is created as an empty string. It has a single element, a null character. The length of this string is zero, though it has one element.
Array null[] at Line 7 is a null string. It’s declared, allocated 5 elements, but never assigned any values.
The strcmp() function at Line 9 compares the two char arrays.
Here’s the program’s output:
You might think that you could use the strlen() function to obtain the string lengths and compare them, but that logic doesn’t apply: strlen() returns zero for the empty[] array, even though that array has a single element. The string is empty.
The strlen() returns an unpredictable value for the null[] array because it’s not initialized. Therefore the string length is wherever the next random null character is found in memory. By the way, this function wouldn’t work most other programming languages where variables must be initialized before you assault them with a function.
Though C doesn’t really have official typing for empty and null strings, you can still tell the difference between them: compare. That’s the secret, should the need ever arise.
C# string.Empty Example
String.Empty. The string.Empty field is an empty string literal.
It is slightly different from an empty string literal constant "". There is a subtle difference—but one that could be significant in some scenarios. It changes the meaning of a program.
Example. We use string.Empty and "" in a C# program. The string.Empty field is initialized to "" at runtime by the .NET Framework. This means it cannot be used in a switch. But you can test with string.Empty in if-statements.
The example assigns the string variable "value" to string.Empty. This is mostly equivalent to "". Next, it tests that variable against the constant "", which returns true, and finally it tests the Length and switches on the value.
Note: You cannot use string.Empty as a switch case, because it cannot be determined at compile-time by the C# compiler.
And: This is an example of how string.Empty is a needlessly disabled version of "".
Switch. Because string.Empty is initialized in the static constructor for the String class, it cannot be determined when you compile your program. It is a readonly field. The case statements in switches can only contain const strings.
Internally, complex switch statements are implemented as a Dictionary, providing constant lookup times. This is sometimes a speedup. If you use if-conditions because they work with string.Empty, you could lose this optimization.
Implementation. Here we look inside the .NET Framework and see how the Empty field is initialized. In the String class, look at the static constructor. The Empty field is assigned to the constant "". This constant is a string literal instance.
C++ String Library — empty
It returns whether the string is empty (i.e. whether its length is 0).
Declaration
Following is the declaration for std::string::empty.
Parameters
Return Value
it returns true if the string length is 0, false otherwise.
Exceptions
if an exception is thrown, there are no changes in the string.
Example
In below example for std::string::empty.
The sample output should be like this −
Annual Membership
Enjoy unlimited access on 5500+ Hand Picked Quality Video Courses
Training for a Team
Affordable solution to train a team and make them project ready.
Copyright © Tutorials Point (India) Private Limited. All Rights Reserved.
We make use of First and third party cookies to improve our user experience. By using this website, you agree with our Cookies Policy. Agree Learn more
Разница между string.empty и string [0] == ‘\ 0’
В чем разница между str.empty() а также str[0] == ‘\0’ ?
Решение
C ++ 11 и выше
string_variable[0] требуется вернуть нулевой символ, если строка пуста. Таким образом, не существует неопределенного поведения, и сравнение по-прежнему работает, если строка действительно пуста. Однако ты мог есть строка, которая начинается с нулевого символа ( «\0Hi there» ) который возвращает true хотя он не пустой. Если вы действительно хотите знать, если он пуст, используйте empty() ,
Pre-C ++ 11
Разница в том, что если строка пуста, то string_variable[0] имеет неопределенное поведение; Индекс 0 отсутствует, если строка const -qualified. Если строка является const квалифицированный, то он вернет нулевой символ.
string_variable.empty() с другой стороны, возвращает true, если строка пуста, и false, если это не так; поведение не будет неопределенным.
Резюме
empty() предназначен для проверки, является ли строка / контейнер пустой или нет. Работает на всех контейнерах, которые его предоставляют и используют empty четко указывает ваше намерение — что очень много значит для людей, читающих ваш код (включая вас).
Другие решения
Начиная с C ++ 11 гарантируется, что str[str.size()] == ‘\0’ , Это означает, что если строка пуста, то str[0] == ‘\0’ , Но строка C ++ имеет явное поле длины, то есть оно может содержать встроенные нулевые символы.
Например. за std::string str(«\0ab», 3) , str[0] == ‘\0’ но str.empty() ложно
Кроме того, str.empty() более читабельно, чем str[0] == ‘\0’ ,
Другие ответы здесь на 100% правильные. Я просто хочу добавить еще три заметки:
empty является общим (каждый контейнер STL реализует эту функцию), в то время как operator [] с size_t работает только со строковыми объектами и массивами. при работе с общим кодом STL, empty является предпочтительным.
также, empty в значительной степени самоочевиден в то время как ==’\0′ не очень много.
когда 2 часа ночи и вы отлаживаете свой код, вы бы предпочли посмотреть if(str.empty()) или же if(str[0] == ‘\0’) ?
если важна только функциональность, мы бы все писали в сборке ванили.
также существует потеря производительности. empty обычно реализуется путем сравнения размера элемента строки с нулем, что очень дешево, легко встроить и т. д. сравнение с первым символом может быть более тяжелым. прежде всего, поскольку все строки реализуют оптимизация коротких строк, Сначала программа должна спросить, находится ли строка в «коротком режиме» или «длинном режиме». ветвление — худшая производительность. если строка длинная, разыменование может быть дорогостоящим, если строка «игнорировалась» в течение некоторого времени, а сама разыменование может вызвать ошибку кэша, которая является дорогостоящей.
empty () не реализован, поскольку ищет наличие нулевого символа в позиции 0, его просто
Который может быть другим
Также остерегайтесь функций, которые вы будете использовать, если используете C ++ 11 или более позднюю версию:
Размер str составляет 3 байта.
Размер ул 3 длинных.
Размер str 0 длинный.
C ++ строка имеет понятие о том, является ли она пустой или нет. Если строка пуста, то str [0] не определено. Только если строка C ++ имеет размер> 1, определяется str [0].
str [i] == ‘\ 0’ — это концепция стиля C-строки. В реализации C-строки последний символ строки — ‘\ 0’, чтобы отметить конец C-строки.
Для C-строки вам обычно приходится «запоминать» длину вашей строки с помощью отдельной переменной. В C ++ String вы можете назначить любую позицию с помощью ‘\ 0’.