Лучший способ обработать пустой указатель, когда запись равняется оператору [дубликат]

Для устройств Redmi и Mi отключить оптимизацию MIUI

Настройки> Дополнительные настройки> Параметры разработчика> Оптимизация MIUI

7
задан Community 23 May 2017 в 12:33
поделиться

7 ответов

@neouser99: это - правильное решение, однако часть, которая пропущена, - то, что при переопределении оператора равенства (оператор ==) Вы должен также переопределить, Равняется функции, и просто сделайте вызов оператора функцией. Не все языки.NET поддерживают перегрузку оператора, следовательно причина переопределения Равняется функции.

2
ответ дан 7 December 2019 в 05:35
поделиться

ReferenceEquals (возражают obj1, возражают obj2),

2
ответ дан 7 December 2019 в 05:35
поделиться

Поскольку Microsoft заявляет,

Распространенная ошибка в перегрузках оператора == состоит в том, чтобы использовать (== b), (== пустой указатель), или (b == пустой указатель) для проверки на ссылочное равенство. Это вместо этого приводит к вызову к перегруженному оператору ==, вызывая бесконечный цикл. Используйте ReferenceEquals или бросьте тип, чтобы Возразить, избежать цикла.

Так используйте ReferenceEquals (a, пустой указатель) ||, ReferenceEquals (b, пустой указатель) является одной возможностью, но бросающий для возражения так же, как хороший (на самом деле эквивалентно, я верю).

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

Однако, как был указан, действительно НЕОБХОДИМО переопределить, Равняется также при переопределении ==. Причем поставщики LINQ записаны на различных языках и делающий разрешение выражения во времени выполнения, кто знает, когда Вы будете битом, не делая его даже при владении всем кодом сами.

7
ответ дан 7 December 2019 в 05:35
поделиться

Просто используйте Resharper для создания Вас методы Equals & GetHashCode. Это создает самый всесторонний код с этой целью.

Обновление я не отправил его нарочно - я предпочитаю, чтобы люди использовали функцию Resharper вместо вставки копии, потому что код изменяется от класса до класса. Что касается разработки C# без Resharper - я не понимаю, как Вы живете, друг.

Так или иначе вот код для простого класса (Сгенерированный Resharper 3.0, более старой версией - я имею 4.0 на работе, я в настоящее время не помню, создает ли это идентичный код),

public class Foo : IEquatable<Foo>
{
    public static bool operator !=(Foo foo1, Foo foo2)
    {
        return !Equals(foo1, foo2);
    }

    public static bool operator ==(Foo foo1, Foo foo2)
    {
        return Equals(foo1, foo2);
    }

    public bool Equals(Foo foo)
    {
        if (foo == null) return false;
        return y == foo.y && x == foo.x;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(this, obj)) return true;
        return Equals(obj as Foo);
    }

    public override int GetHashCode()
    {
        return y + 29*x;
    }

    private int y;
    private int x;
}
0
ответ дан 7 December 2019 в 05:35
поделиться
if ((object)uq1 == null) 
    return ((object)uq2 == null)
else if ((object)uq2 == null)
    return false;
else
    //return normal comparison

Это сравнивает их как равных, когда оба являются пустыми.

-1
ответ дан 7 December 2019 в 05:35
поделиться

Следуйте за обработкой DB:

null == <anything> is always false
-1
ответ дан 7 December 2019 в 05:35
поделиться

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

Действительно, Вы теряете symmetricity бинарного оператора, но все еще...

(примечание по ответу Purfideas: Пустой указатель мог бы равняться Пустому указателю в случае необходимости как значению сигнальной метки массива),

Также думайте о семантике о Вашем == функция: иногда Вы действительно хотите смочь выбрать, тестируете ли Вы на

  • Идентификационные данные (указывает на тот же объект),
  • Равенство значения
  • Эквивалентность (например, 1.000001 эквивалентно.9999999),
-1
ответ дан 7 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: