2015-09-03 3 views
2

Я прочитал некоторый скрипт и, кажется, сложно понять. Надежда кто-то может объяснить, почему Первый:Какая разница между a == b и (a & b) == b

public static bool ContainsDestroyWholeRowColumn(BonusType bt) 
    { 
     return (bt & BonusType.DestroyWholeRowColumn) 
      == BonusType.DestroyWholeRowColumn; 
    } 

Почему не пишут bt.Equal(BonusType.DestroyWholeRowColumn) или bt == BonusType.DestroyWhoeRowColumn? Второе:

public bool IsSameType(Shape otherShape) 
    { 
     if (otherShape == null || !(otherShape is Shape))// check otherShape is not null and it is Shape 
      throw new ArgumentException("otherShape"); 

     return string.Compare(this.Type, (otherShape as Shape).Type) == 0; 
    } 

если метод ввода не правильный тип. Я думаю, что это будет начеку немедленно, поэтому они также должны проверить тип объекта Последнее:

//if we are in the middle of the calculations/loops 
      //and we have less than 3 matches, return a random one 
      if(row >= Constants.Rows/2 && matches.Count > 0 && matches.Count <=2) 
       return matches[UnityEngine.Random.Range(0, matches.Count - 1)]; 

Я думал это код всегда возвращает 0; Что случилось? Писатель был не прав, или я пропустил некоторые базовые знания. Пожалуйста, помогите мне, если вы знаете. Спасибо

+0

'3 & 1 == 1', но' 3! = 1'. – Mat

+0

@Mat: Здесь нет целочисленных типов (я думаю, вопрос не говорит). – Thilo

+0

Да. a и b не являются целыми, в этом случае это BonusType –

ответ

8

Это означает, что BonusType является перечислением типа флага, в котором несколько значений могут быть объединены с помощью побитовых операций.

(bt & BonusType.DestroyWholeRowColumn) == BonusType.DestroyWholeRowColumn означает, что мы проверяем, установлен ли флаг DestroyWholeRowColumn на переменной bt.

Мы также можем проверить флаг enum с помощью метода Enum.HasFlag, но он доступен только .Net 4 и далее.

Для получения дополнительной информации о перечислениях типа флага укажите this answer.

+0

Спасибо, поэтому. Я вообще вижу. Итак, вы можете помочь мне объяснить другие вопросы. Я отвечаю на 3 вопроса. Заранее спасибо. Может быть, мы должны использовать string.compare вместо string.Equal (string)? –

+0

Вы можете прочитать вопрос/ответ на перечисления, которые я предоставил, чтобы получить ответ на ваш второй вопрос. Однако, я не получил ваш третий вопрос. – Yogesh

1

первый вопрос

a == b тестирует, что оба a и b имеют одинаковое значение. (a & b) == b, a - это битмаска (содержит несколько бит) и проверяет, включен ли бит b.