С#: путаница о ToUpper() и ToLower()
если я сделаю что-то вроде этого...
String myVar = "in";
if(myVar.ToUpper() == "in")
{
//do something
}
Это не собирается заходить внутрь "if" block..right?
или
Будет ли он проверять ОБА для "in" и "IN" и делать все, что внутри, если? Если да, то почему? Разве не предполагается пропускать то, что внутри блока "if"?
То же самое замешательство и о ToLower()
тоже
Изменить. Поэтому для проверки обоих случаев мне нужно написать:
if((myVar.ToUpper().Equals("in"))&&(myVar.Equals("in")))
Как это... прямо?
Ответы
Ответ 1
Вместо того, чтобы преобразовывать в верхний регистр и затем сравнивать, вы должны использовать сравнение равенства, которое можно сделать нечувствительным к регистру. Например:
if (myVar.Equals("in", StringComparison.OrdinalIgnoreCase))
{
...
}
Вы должны тщательно рассмотреть, какие правила подходят - порядковый, текущая культура, инвариантная культура или, возможно, другая культура целиком (например, используя StringComparer.Create(culture, true)
).
Подробнее об этом читайте в статье MSDN Рекомендации по использованию строк в .NET Framework.
Ответ 2
Выражение something.ToUpper().Equals("lowercaseletters")
никогда не будет истинным, поэтому в вашем примере if-block не будет выполнен. И, конечно же, это относится и к ToLower; something.ToLower().Equals("UPPERCASE")
никогда не будет истинным.
Ответ 3
"IN" не равно "in" - поэтому он не выполняет блок if. В случае toLower() он выполнил бы if-блок как "in" равно "in" ..
Ответ 4
Сначала, если вы хотите сравнить строки, используйте .Equals()
myVar.toUpper().Equals("in")
Сначала сначала выполняется весь код внутри if, только после этого проверяется возврат.
так
String myVar="in";
if(myVar.toUpper().Equals("in"))
{
//do something
}
не "делать что-то".
Ответ 5
Если вы сделаете что-то вроде того, что сказали, он не войдет в блок if, и вот почему:
Операторы применяются к объекту слева. Таким образом, ваш код будет таким же, как и при написании:
String myVar="in";
String testVar = myVar.ToUpper();
if(testVar=="in") //This will never be true
{
//do something
}
В вашем редактировании вы все еще не тестируете, если ваша строка == "IN", вы делаете 2 теста, чтобы увидеть, является ли ваша строка == "in".
Если вы изменили оригинал на это, он будет работать:
String myVar="in";
if(myVar.ToUpper()=="IN")
{
//do something
}
Ваше изменение должно быть таким, чтобы проверить оба случая:
if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in")))
EDIT: Еще несколько объяснений от Стивена Комментарий:
if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in")))
Этот образец кода выполняет 2 сравнения, но если myVar будет только когда-либо смешанным версией case в (IE: in In iN IN), тогда второе сравнение не требуется. После того, как я преобразовал строку в ToUpper(), вам нужно только проверить, равно ли она IN. Поэтому я бы заменил эту строку:
if(myVar.ToUpper().Equals("IN"))
или
if(myVar.ToUpper() == "IN")
Я лично использовал бы метод == not.Equals.