какой оператор определяет равенство двух значений
Операторы равенства (справочник по C#)
Оператор равенства ==
Равенство типов значений
Операнды встроенных типов значений равны, если равны их значения.
Два операнда одного типа enum равны, если равны соответствующие значения базового целочисленного типа.
Равенство ссылочных типов
По умолчанию два операнда ссылочного типа, отличные от записи, являются равными, если они ссылаются на один и тот же объект.
Равенство типов записей
Как показано в предыдущем примере, в случае с элементами ссылочного типа, отличными от записей, сравниваются их ссылочные значения, а не экземпляры, на которые они ссылаются.
Равенство строк
Два операнда string равны, если они оба имеют значение null или оба экземпляра строки имеют одинаковую длину и идентичные символы в каждой позиции символа.
Это порядковое сравнение, учитывающее регистр. Дополнительные сведения о том, как сравнивать строки, см. в статье Сравнение строк в C#.
Равенство делегатов
Два операнда делегатов одного типа среды выполнения равны, если оба из них имеют значение null или их списки вызовов имеют одинаковую длину и содержат одинаковые записи в каждой позиции:
Подробные сведения см. в разделе Delegate equality operators (Операторы равенства делегатов) в спецификации языка C#.
Делегаты, созданные в результате оценки семантически идентичных лямбда-выражений не будут равны, как показано в примере ниже:
Возможность перегрузки оператора
Спецификация языка C#
Дополнительные сведения о равенстве типов записей см. в разделе Элементы равенства предложения функции записей.
Проверка равенства (руководство по программированию на C#)
Иногда возникает необходимость проверить равенство двух значений. В некоторых случаях проверяется равенство значений, которое также называют их эквивалентностью, что означает, что содержащиеся в двух переменных значения равны. В других случаях требуется определить, ссылаются ли две переменные на один и тот же объект в памяти. Такой тип равенства называется равенством ссылок или идентичностью. В этом разделе описаны эти два типа равенства и приведены ссылки на разделы, содержащие дополнительные сведения.
Равенство ссылок
Равенство ссылок означает, что два объекта ссылаются на один и тот же объект. Это может произойти при простом присваивании, как показано в следующем примере.
В этом фрагменте кода создается два объекта, но после инструкции присваивания они оба ссылаются на один и тот же объект. Поэтому между ними устанавливается равенство ссылок. Метод ReferenceEquals позволяет определить, ссылаются ли две ссылки на один и тот же объект.
Равенство значений
Равенство значений означает, что два объекта содержат одинаковое значение или одинаковые значения. Для примитивных типов значений, таких как int или bool, проверка на равенство значений представляет собой очевидную задачу. Можно использовать оператор ==, как показано в следующем примере.
Для большинства других типов проверка равенства значений является более сложной, поскольку при этом необходимо понимать, как равенство определено в типе. Для всех классов и структур, имеющих несколько полей или свойств, равенство значений часто определяется как равенство значений всех полей и свойств. Например, два объекта Point могут быть определены как равные, если значение pointA.X равняется pointB.X, а значение pointA.Y равняется pointB.Y. Для записей равенство значений означает, что две переменные типа «запись» равны, если совпадают типы и все значения свойств и полей.
Однако общего требования о том, что равенство должно определяться на основе всех полей в типе, нет. Оно может определяться и на основе части полей. При сравнении значений типов сторонних разработчиков необходимо понимать, как именно реализовано равенство для таких типов. См. сведения об определении равенства значений в собственных классах и структурах в руководстве по определению равенства значений для типа.
СОДЕРЖАНИЕ
Равенство
Применение
Равенство местоположения и равенство контента
Первый тип равенства обычно подразумевает второй (за исключением таких вещей, как не число ( NaN ), которые не равны сами себе), но обратное не обязательно верно. Например, два строковых объекта могут быть разными объектами (неравными в первом смысле), но содержать одну и ту же последовательность символов (равными во втором смысле). См. Личность для получения дополнительной информации об этой проблеме.
Другие элементы программирования, такие как вычислимые функции, могут либо не иметь чувства равенства, либо равенства, которое невозможно вычислить. По этим причинам некоторые языки определяют явное понятие «сопоставимого» в форме базового класса, интерфейса, признака или протокола, которое используется либо явно, путем объявления в исходном коде, либо неявно, через структуру вовлеченного типа.
Сравнение значений разных типов
Заказ
Сравнение больше и меньше нечисловых данных выполняется в соответствии с соглашением о сортировке (например, для текстовых строк, лексикографическим порядком ), которое может быть встроено в язык программирования и / или конфигурируется программистом.
Логическая эквивалентность
Стандартные реляционные операторы
Наиболее распространенные числовые реляционные операторы, используемые в языках программирования, показаны ниже.
=
Синтаксис
Цепочка операторов
Выражению можно придать x знакомый математический смысл, и некоторые языки программирования, такие как Python и Raku, делают это. Другие, такие как C # и Java, этого не делают, отчасти потому, что это будет отличаться от того, как большинство других инфиксных операторов работают в C-подобных языках. Язык программирования D этого не делает, поскольку он поддерживает некоторую совместимость с C, и «разрешение выражений C, но с несколько иной семантикой (хотя, возможно, в правильном направлении) добавило бы больше путаницы, чем удобства».
Путаница с операторами присваивания
B и C
Поскольку позже была введена небольшая система типов, B затем стал C. Популярность этого языка вместе с его ассоциацией с Unix привела к синтаксическому развитию Java, C # и многих других языков, которые следовали этому примеру, несмотря на этот ненужный конфликт с математическим значением слова знак равенства.
Языки
В АЛГОЛ-подобных языках, таких как Pascal, Delphi и Ada (в том смысле, что они допускают определения вложенных функций ), а также в Python и многих функциональных языках, среди прочего, операторы присваивания не могут появляться в выражении (включая if предложения), таким образом исключая этот класс ошибок. Некоторые компиляторы, такие как GNU Compiler Collection (GCC), выдают предупреждение при компиляции кода, содержащего оператор присваивания внутри оператора if, хотя есть некоторые законные способы использования присваивания внутри условия if. В таких случаях присвоение должно быть явно заключено в дополнительную пару круглых скобок, чтобы избежать предупреждения.
Точно так же некоторые языки, такие как BASIC, используют только = символ как для присваивания, так и для равенства, поскольку они синтаксически разделены (как в Pascal, Ada, Python и т. Д., Операторы присваивания не могут появляться в выражениях).
Некоторые программисты имеют привычку писать сравнения с константами в обратном обычному порядке:
В этой таблице перечислены различные механизмы проверки этих двух типов равенства на разных языках:
Ruby использует a === b для обозначения «b является членом множества a», хотя детали того, что значит быть членом, значительно различаются в зависимости от задействованных типов данных. === здесь известен как оператор «равенство случаев» или «подчинение случаев».
Как определить равенство значений для класса или структуры (руководство по программированию на C#)
При определении класса или структуры необходимо решить, имеет ли смысл создавать пользовательское определение равенства значений (или эквивалентности) для этого типа. Обычно равенство значений реализуется, если объекты этого типа будут добавляться в коллекции или если они предназначены в первую очередь для хранения набора полей или свойств. В основу определения равенства значений можно положить сравнение всех полей и свойств в типе или только их части.
Последовательные вызовы x.Equals(y) возвращают одно и то же значение до тех пор, пока не будут изменены объекты, на которые ссылаются x и y.
Любая определяемая вами структура имеет заданную по умолчанию реализацию равенства значений, которая наследуется от переопределения System.ValueType метода Object.Equals(Object). Эта реализация использует отражение для проверки всех полей и свойств в типе. Хотя эта реализация возвращает верный результат, она отличается невысокой скоростью по сравнению с пользовательской реализацией, которую можно написать специально для конкретного типа.
Детали реализации равенства значений для классов и структур различаются. Однако для реализации равенства как для классов, так и для структур, необходимо выполнить одни и те же базовые действия.
Переопределите Object.GetHashCode таким образом, чтобы два объекта с равными значениями создавали одинаковый хэш-код.
Начиная с версии C# 9.0 можно использовать записи для получения семантики равенства значений без ненужного стандартного кода.
Пример класса
В следующем примере показана реализация равенства значений в классе (ссылочный тип).
В классах (ссылочных типах) реализация по умолчанию обоих методов Object.Equals(Object) выполняет проверку равенства ссылок, а не значений. Когда разработчик переопределяет виртуальный метод, его задача заключается в том, чтобы реализовать семантику равенства значений.
Приведенный выше код может не поддерживать все сценарии наследования, как ожидается. Рассмотрим следующий код.
Пример структуры
В следующем примере показана реализация равенства значений в структуре (тип значения).
Для структур реализация по умолчанию Object.Equals(Object) (представляет собой переопределенную версию в System.ValueType) выполняет проверку равенства значений посредством отражения, сравнивая значения каждого поля в типе. Когда разработчик переопределяет виртуальный метод Equals в структуре, его задача состоит в том, чтобы найти более эффективный способ проверки равенства значений и, если это возможно, реализовать сравнение только на основании части полей или свойств структуры.
Операторы отношения и равенства C
Синтаксис
relational-expression:
shift-expression
relational-expression shift-expression
relational-expression = shift-expression
equality-expression:
relational-expression
equality-expression == relational-expression
equality-expression != relational-expression
Операторы отношения и равенства проверяют следующие отношения.
Оператор | Проверяемое отношение |
---|---|
Первый операнд больше второго операнда | |
= | Первый операнд больше или равен второму операнду |
== | Первый операнд равен второму операнду |
!= | Первый операнд не равен второму операнду |
Операнды могут быть целыми числами, числами с плавающей запятой или указателями. Типы операндов могут быть разными. Операторы отношения выполняют обычные арифметические преобразования с операндами целого типа и типа с плавающей запятой. Кроме того, с операторами отношения и равенства можно использовать следующие сочетания типов операндов:
Сравнение указателей определено только для частей одного и того же объекта. Если указатели относятся к элементам массива, сравнение аналогично сравнению соответствующих индексов. Адрес первого элемента массива «меньше» адреса последнего элемента. В случае структур указатели на те члены структуры, которые были объявлены позже, «больше» указателей на члены, объявленные в структуре ранее. Указатели на члены одного объединения эквивалентны.
Примеры
Ниже показаны примеры операторов отношения и равенства.
Поскольку x и y равны, выражение в этом примере возвращает значение 0.
Фрагмент в этом примере задает для каждого элемента массива array постоянное символьное значение null.
- простой кнопочный телефон для пенсионера какой лучше
- Сушит горло ночью причины и что делать