2013-11-11 3 views
-5

Посмотрите на этих ребят:Сравнение строк - объект со строкой

Вывод из моего непосредственного окна в VisualStudio.

"15" == x.Documents.Attributes["key"] 
false 
x.Documents.Attributes["key"] 
"15" 

Почему false, когда оба значения равны ????

Атрибуты: Dictionary<string, object> ... ничего особенного.

Я не понимаю. Я думал, что == знает, как обрабатывать строки, даже если с object.ToString().

Что мне не хватает парней? Помогите мне в этом.

+6

Попробуйте делать .ToString() на x.DocumentFile.Attributes [ "ключ"]. вы пытаетесь сравнивать объекты, а не значения. значение объекта не совпадает с строкой. –

+1

Поскольку ваш атрибут является объектом, он выполняет объект Equals, который просто проверяет адреса памяти. Если вы знаете, что это строка, вы можете применить ее к строке перед применением равенства. В качестве альтернативы используйте '.Equals' –

+1

-1, кажутся суровыми! – Liam

ответ

2

Если вы сравниваете объекты (как и в вашем случае), то обычно лучше использовать метод Equals, а не оператор ==, как виртуальный, поэтому он будет вызывать правильную реализацию.

Для вашего кода:

x.Documents.Attributes["key"].Equals("15"); 

Если вернуть истинный

EDIT: это справедливо только если ваш тип действительно является строкой. Если вы хотите, чтобы проверить, если строка представление вашего объекта совпадает с другой строковое представление, вы должны делать, как другие говорят и делают:

x.Documents.Attributes["key"].ToString() == "15"; 

То есть, я бы не рекомендовал его. Если у объекта нет ToString(), все, что вы проверите, это то, что они одного типа (Object s реализация ToString()). На данный момент, это зависит от того, что вы пытаетесь сделать ...

+0

Это правда, я отредактирую –

2

Ответ довольно прост: вы получаете ключ, который имеет тип Object, и вы сравниваете его с string. Попробуйте позвонить ToString() на ключ, который вы получите, и вы получите правильное сравнение и, следовательно, true.

+0

Вот почему я задаю вопрос. Я думал, что ToString вызывается автоматически. –

+0

@devhedgehog Нет, toString() не вызывается автоматически, и это хорошо. –

+0

(Объяснение заявления @ DavidArno) Поскольку иногда вы хотите проверить, есть ли у вас точно такой же ключ, а не проверка того, имеет ли ваш ключ то же самое значение VALUE, что и тот, с которым вы сравниваете. – Voidpaw

0

Первая линия: x.Documents.Attributes["key"]

Вторая строка: x.DocumentFile.Attributes["key"]

разницу?

+0

Я изменил его. Я скопировал неправильный код. –

4

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

"15" == (string)x.Documents.Attributes["key"] 

Это потому, что операторы, такие как == являются перегружен, не переопределены - они не являются полиморфными.

Если значения не являются строками, то это безопаснее:

"15" == x.Documents.Attributes["key"] as string 

потому что as вернется null если возвращаемое значение не является на самом деле string== отлично от null значений здесь).

+0

Но не являются ли ссылки одинаковыми из-за интернирования строк? –

+2

@TimSchmelter, который зависит от того, откуда взялись строки; строка, загруженная из базы данных, или файл, или с помощью манипуляции с строкой, не будет интернирована. Здесь гарантируется, что здесь будет только буквальный '' 15 "'. –

+0

еще один продуманный и задокументированный ответ, именно этот вопрос нужен +1 – Liam

0

вы должны использовать на равных и приведение типа в строку

"15".equals( 
    (string) x.Documents.Attributes["key"]) 
    false 
    x.Documents.Attributes["key"] 
    "15" 
0

Марк Gravell ответ абсолютно правильно, только добавить, вот пример:

var dic = new Dictionary<string, object> 
{ 
    { 
     "key", 
     string.Format("{0}", "hello") // this to avoid interning string 
    } 
}; 
Console.WriteLine(dic["key"] == "hello"); // false 
Console.WriteLine((string)dic["key"] == "hello"); // true 
Смежные вопросы