С#: путаница о 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.