2011-01-16 2 views
9

В инструкции If Когда я должен использовать операторы =, ==. Есть ли оператор ===? В чем разница между этими операторами?Использование равных операторов в C#

+4

Какая книга вы используете для обучения C#? Это должно быть рассмотрено в первой главе или двух. –

+0

Извините, не могу сказать вам имя книги, это было бы как оскорбление автора :). Его печальные примеры не очень хорошо объясняются в этой книге :( – subanki

+3

@subanki: Если вы считаете книгу *, что плохо, ** получите другую **. В чем смысл тратить время на изучение языка с книга, которую вы даже согласитесь, настолько плоха, что это смутит автора? См. [этот вопрос] (http://stackoverflow.com/questions/477748/what-are-the-best-c-net-books), и [это другой вопрос] (http://stackoverflow.com/questions/46048/what-is-the-best-book-to-learn-c) для некоторых рекомендаций. –

ответ

20

= это назначение, как и в

var i = 5; 

Не следует использовать этот оператор в, если заявление.

== для сравнения как в

if(i == 6){...} 

нет === оператора в C#

+0

Итак, если я использую его так: ......... if (i = 5) {x = 10;} ...... в этом случае i присваивается значение 5? – subanki

+2

C# достаточно умен, чтобы предупредить вас, когда вы пытаетесь скомпилировать этот код. это должно быть, если (i == 5) {x = 10;} EDIT: Пояснения – tenor

+0

Я собирался сказать, что это скомпилируется. Я даже не уверен, что придет предупреждение. EDIT: Я знаю, что VB скомпилирует его. И я не думаю, что вы когда-нибудь попадете внутрь блока if. –

3

одного = для присваивания, как:

String myString = "Hi There"; 

Двойной равный для сравнения

if (5 == 5) 
{ 
    do something 
} 

тройные равно в некоторых языках означают точно равны.

C# не использует этот оператор.

+0

В C# нет ===. –

0

Один знака равенства используется только для присвоения переменного значения, то присваивание также возвращает одно и то же значение, поэтому я мог бы использоваться в выражении if, но никогда не должен (почти ...) использоваться в выражении if. Двойные знаки равенства используются для проверки того, являются ли два значения равными и что вы используете большую часть времени. Я не знаю оператора ===.

/Виктор

1

В, если заявление вы обычно проверить равенство с помощью ==, оператор = является оператором assignemt, и мне известно, нет === В C# я никогда не слышал об этом, но это существует в других языках, я думаю, что в javascript он делает.

0

= является оператором присваивания в то время как
== является оператором Comparision

Пример:

int a=2; 
int b=3;  
int c=a=b; // a, b, c is equal to 3 as b=3 

в то время как

int a=2; 
int b=3; 

bool c= a==b // c = false since result of a==b is false 
1

В дополнение к другим ответам, ReferenceEquals(x,y), вероятно, является самым близким к ===.

0

я наткнулся === только в JavaScript пока. Там есть строгий равный оператор. Я использовал его несколько раз, как это if(obj === undefined){ alert("obj has sublimed");}

+0

Довольно уверен, что вы имели в виду: if (typeof obj === 'undefined') {alert ("obj has sublimed");} --- ваш пример по определению возвращает ошибку ссылки – Carnix

+0

@Carnix Да, вы правы, (typeof obj === 'undefined') '- лучший способ его использования. Кроме того, уже давно я опубликовал этот ответ: -D и узнал больше до сегодняшнего дня, чем то, что я знал в 2011 году. – v1p

10

(Ниже в некоторой степени «комментарий», но это слишком долго, чтобы быть в комментарии и будут потеряны с другими комментариями в этом посте.)

В C# == (как все операторов в C#) является не полиморфным. То есть, «версия» ==, которая вызывается всегда, основана на статическом типе во время компиляции.

Например:

object a = Guid.NewGuid(); 
object b = new Guid(""+a); 
a == b // false -- uses object.== -- an *identity* compare 

Equalsвиртуальный метод, с другой стороны, определяется на object и, таким образом, полиморфными во всех подтипов.

object a = Guid.NewGuid(); 
object b = new Guid(""+a); 
a.Equals(b) // true -- uses Guid.Equals 

Выбор из которых один использовать (== или Equals) иногда тонкая - но важно. Большинство типов коллекций будут использовать Equals для таких задач, как Contains и т.д. (Это в значительной степени требуется для всех общих контейнеров, нет T.== для произвольного типа T.)

// compile-time error: Operator '==' cannot be applied to operands of type 'T' and 'T' 
bool equals<T> (T a, T b) { return a == b; } 

// fair-game, because object defines Equals and it's polymorphic to subtypes 
bool equals<T> (T a, T b) { return a.Equals(b); } 

См When should I use == and when should I use Equals? и Guidelines for Implementing Equals and the Equality Operator (==) и т.д. лично я использую == над Equals для статический разрешаемых конкретных типов, для которых == хорошо определен и я не будет (по договору или конвенция) сделки с подтипом - примеры являются string и типов (большинство) структур (например int, Guid).

Счастливое кодирование.

Редактировать: Нет оператора C# === (как говорили люди, duh!). Если говорить о варианте JavaScript, было бы приблизительно:

bool trippleEquals (object a, object b) { 
    return a.GetType() == b.GetType() && a.Equals(b); 
} 

(Это строгое равенство в JavaScript - но не приемлю идентичности).

Если говорить о идентичности объекта, то она должна быть такой же, как (object)a == (object)b, который имеет ту же семантику, object.ReferenceEquals(a,b).

+0

+1 для отображения разницы между _strict равенством_ и _объектом_объекта. – comecme

+0

приятный, тщательный ответ – cori

0

Это длинный комментарий, поэтому я решил добавить еще одно сообщение.

Я установил Var переменных в список объектов этого и производится сравнение по двум переменным, которые всегда неудавшемуся сравнению логика:

object Object1; 
    object Object2; 
    var v1 = Object1; 
    var v2 = Object2; 
    if (v1 != v2) 
    { 
    // Do something 
    } 

Благодаря постам здесь, в этой теме, я изменил логику следующим образом и теперь он отлично работает:

object Object1; 
    object Object2; 
    var v1 = Object1; 
    var v2 = Object2; 
    if (!v1.Equals(v2)) 
    { 
    // Do something 
    } 
Смежные вопросы