2016-08-23 6 views
1

Вот кусок кодаИспользование объекта в одной строке без возврата декларации

public override bool Equals(object obj) 
     { 
      var myObj= obj as MyClass; 
      return obj == null || myObj== null || !ReferenceEquals(this, obj) ? false : 
       (this.V1== myObj.V1) && (this.V2== myObj.V2) && (this.V3== myObj.V3); 
     } 

Можно ли использовать myObj в обратном трубопроводе, не объявляя его выше?

Спасибо!

+0

Да, 'return obj == null || obj как MyClass == null || ! ReferenceEquals (это, obj)? false: true; '. – Enigmativity

+1

Вы могли бы даже сделать это: 'return obj as MyClass! = Null && ReferenceEquals (this, obj);'. – Enigmativity

+0

О да .. Я немного глуп, я скрыл часть кода, которая фактически вызвала проблему, позвольте мне изменить ... – Cratebox99

ответ

3

Прежде всего, ответ «да», но на самом деле это не хороший знак. После выполнения броска, если вы собираетесь использовать результат приведения несколько раз, это вполне ожидаемая вещь, которую вам нужно поместить в какую-то временную переменную.

В коде, который вы указали, все выражение перед ? может быть упрощено до ReferenceEquals(this, obj), поскольку ссылочные равны должны быть уже безопасными с нулями.

Кроме того, поскольку вы делаете ссылочные равны и возвращаете false, когда он терпит неудачу, вам не нужны никакие другие проверки. Правая сторона : является излишней. Он активируется только тогда, когда ref-equals возвращает true, но тогда такой случай означает, что две сопоставимые переменные на самом деле являются одним и тем же объектом, поэтому все другие сравнения вернут true так или иначе, поэтому им не нужно.

так .. весь код сводится к

return ReferenceEquals(this, obj); 

. Мере, как работает ваше текущее выражение.

Из-за этого «все-сводится к правильному обращению» я на самом деле думаю, что вы этого не хотели.

Я думаю, вы хотели проверить, являются ли они равными, а затем быстро вернутся. Тогда только если бы они не были равными, вы бы выполнили кусочно-смежные сравнения внутренних свойств. Что-то вроде:

if(refequals(a,b)) return true; 
if((a==null) != (b==null)) return false; 
return a.prop1==b.prop1 && a.prop2 == b.prop2 && ... ; 

.., а затем вы можете сжать его на один лайнер, но в чем смысл? Уплотнение просто затрудняет чтение, нет реального выигрыша в производительности, он просто упаковывает все это в одну строку, которая даже не выигрывает в терминах «длины текста», поскольку вы можете просто «свернуть» функцию в большинстве IDE ...

(BTW. в коде последняя строка является A/B/нуль-безопасен благодаря refequals TAHT поймает случай 2 нулей и хитрой второй линии, которая улавливает все случаи 1-сторонней нуля)

 Смежные вопросы

  • Нет связанных вопросов^_^