Перейти к содержимому

Equals c что делает

  • автор:

Операторы равенства: == и !=

Бинарные операторы равенства сравнивают операнды для строгого равенства или неравенства.

Операторы равенства, то есть равно ( == ) и не равно ( != ), имеют более низкий приоритет, чем операторы отношения, но их поведение аналогично. Тип результата для этих операторов . bool

== Оператор равного () возвращает true , если оба операнда имеют одно и то же значение; в противном случае возвращается false . Оператор not-equal-to ( != ) возвращает true , если операнды не имеют того же значения; в противном случае возвращается false .

Оператор ключевое слово для !=

C++ указывает not_eq в качестве альтернативной орфографии для != . (Нет альтернативной орфографии для == .) В C альтернативная орфография предоставляется в виде макроса в заголовке . В C++альтернативная орфография является ключевое слово; или эквивалентное не рекомендуется. В Microsoft C++ /permissive- параметр или /Za компилятор требуется для включения альтернативной орфографии.

Пример

// expre_Equality_Operators.cpp // compile with: /EHsc #include using namespace std; int main()

Операторы равенства могут сравнивать указатели на члены одного типа. В таком сравнении выполняются преобразования указателя на члены. Указатели на члены также можно сравнить с константным выражением, результатом которого является значение 0.

String. Equals Метод

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

Определяет, равны ли значения двух объектов String.

Перегрузки

Определяет, равны ли значения этого экземпляра и указанного объекта, который также должен быть объектом String.

Определяет, равны ли значения этого экземпляра и указанного объекта String.

Определяет, совпадают ли значения двух указанных объектов String.

Определяет, равны ли значения этой строки и указанного объекта String. Параметр определяет язык и региональные параметры, учет регистра и правила сортировки, используемые при сравнении.

Определяет, совпадают ли значения двух указанных объектов String. Параметр определяет язык и региональные параметры, учет регистра и правила сортировки, используемые при сравнении.

Equals(Object)

Определяет, равны ли значения этого экземпляра и указанного объекта, который также должен быть объектом String.

public: override bool Equals(System::Object ^ obj);
public override bool Equals (object obj);
public override bool Equals (object? obj);
override this.Equals : obj -> bool
Public Overrides Function Equals (obj As Object) As Boolean
Параметры

Строка для сравнения с данным экземпляром.

Возвращаемое значение

true , если объект obj имеет тип String и его значение совпадает со значением данного экземпляра; в противном случае — false . Если значением параметра obj является null , метод возвращает false .

Примеры

В следующем примере демонстрируется Equals метод.

// Sample for String::Equals(Object) // String::Equals(String) // String::Equals(String, String) using namespace System; using namespace System::Text; int main() < StringBuilder^ sb = gcnew StringBuilder( "abcd" ); String^ str1 = "abcd"; String^ str2 = nullptr; Object^ o2 = nullptr; Console::WriteLine(); Console::WriteLine( " * The value of String str1 is ''.", str1 ); Console::WriteLine( " * The value of StringBuilder sb is ''.", sb ); Console::WriteLine(); Console::WriteLine( "1a) String::Equals(Object). Object is a StringBuilder, not a String." ); Console::WriteLine( " Is str1 equal to sb?: ", str1->Equals( sb ) ); Console::WriteLine(); Console::WriteLine( "1b) String::Equals(Object). Object is a String." ); str2 = sb->ToString(); o2 = str2; Console::WriteLine( " * The value of Object o2 is ''.", o2 ); Console::WriteLine( " Is str1 equal to o2?: ", str1->Equals( o2 ) ); Console::WriteLine(); Console::WriteLine( " 2) String::Equals(String)" ); Console::WriteLine( " * The value of String str2 is ''.", str2 ); Console::WriteLine( " Is str1 equal to str2?: ", str1->Equals( str2 ) ); Console::WriteLine(); Console::WriteLine( " 3) String::Equals(String, String)" ); Console::WriteLine( " Is str1 equal to str2?: ", String::Equals( str1, str2 ) ); > /* This example produces the following results: * The value of String str1 is 'abcd'. * The value of StringBuilder sb is 'abcd'. 1a) String::Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: False 1b) String::Equals(Object). Object is a String. * The value of Object o2 is 'abcd'. Is str1 equal to o2?: True 2) String::Equals(String) * The value of String str2 is 'abcd'. Is str1 equal to str2?: True 3) String::Equals(String, String) Is str1 equal to str2?: True */ 
// Sample for String.Equals(Object) // String.Equals(String) // String.Equals(String, String) using System; using System.Text; class Sample1 < public static void Main() < StringBuilder sb = new StringBuilder("abcd"); String str1 = "abcd"; String str2 = null; Object o2 = null; Console.WriteLine(); Console.WriteLine(" * The value of String str1 is ''.", str1); Console.WriteLine(" * The value of StringBuilder sb is ''.", sb.ToString()); Console.WriteLine(); Console.WriteLine("1a) String.Equals(Object). Object is a StringBuilder, not a String."); Console.WriteLine(" Is str1 equal to sb?: ", str1.Equals(sb)); Console.WriteLine(); Console.WriteLine("1b) String.Equals(Object). Object is a String."); str2 = sb.ToString(); o2 = str2; Console.WriteLine(" * The value of Object o2 is ''.", o2); Console.WriteLine(" Is str1 equal to o2?: ", str1.Equals(o2)); Console.WriteLine(); Console.WriteLine(" 2) String.Equals(String)"); Console.WriteLine(" * The value of String str2 is ''.", str2); Console.WriteLine(" Is str1 equal to str2?: ", str1.Equals(str2)); Console.WriteLine(); Console.WriteLine(" 3) String.Equals(String, String)"); Console.WriteLine(" Is str1 equal to str2?: ", String.Equals(str1, str2)); > > /* This example produces the following results: * The value of String str1 is 'abcd'. * The value of StringBuilder sb is 'abcd'. 1a) String.Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: False 1b) String.Equals(Object). Object is a String. * The value of Object o2 is 'abcd'. Is str1 equal to o2?: True 2) String.Equals(String) * The value of String str2 is 'abcd'. Is str1 equal to str2?: True 3) String.Equals(String, String) Is str1 equal to str2?: True */ 
// Sample for String.Equals(Object) // String.Equals(String) // String.Equals(String, String) open System open System.Text let sb = StringBuilder "abcd" let str1 = "abcd" let str2 = string sb let o2: obj = str2 printfn $""" * The value of String str1 is ''. * The value of StringBuilder sb is ''. 1a) String.Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: " 1b) String.Equals(Object). Object is a String. * The value of Object o2 is ''. Is str1 equal to o2?: 2) String.Equals(String) * The value of String str2 is ''. Is str1 equal to str2?: 3) String.Equals(String, String) Is str1 equal to str2?: """ (* This example produces the following results: * The value of String str1 is 'abcd'. * The value of StringBuilder sb is 'abcd'. 1a) String.Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: False 1b) String.Equals(Object). Object is a String. * The value of Object o2 is 'abcd'. Is str1 equal to o2?: True 2) String.Equals(String) * The value of String str2 is 'abcd'. Is str1 equal to str2?: True 3) String.Equals(String, String) Is str1 equal to str2?: True *) 
' Sample for String.Equals(Object) ' String.Equals(String) ' String.Equals(String, String) Imports System.Text Class Sample Public Shared Sub Main() Dim sb As New StringBuilder("abcd") Dim str1 As [String] = "abcd" Dim str2 As [String] = Nothing Dim o2 As [Object] = Nothing Console.WriteLine() Console.WriteLine(" * The value of String str1 is ''.", str1) Console.WriteLine(" * The value of StringBuilder sb is ''.", sb.ToString()) Console.WriteLine() Console.WriteLine("1a) String.Equals(Object). Object is a StringBuilder, not a String.") Console.WriteLine(" Is str1 equal to sb?: ", str1.Equals(sb)) Console.WriteLine() Console.WriteLine("1b) String.Equals(Object). Object is a String.") str2 = sb.ToString() o2 = str2 Console.WriteLine(" * The value of Object o2 is ''.", o2) Console.WriteLine(" Is str1 equal to o2?: ", str1.Equals(o2)) Console.WriteLine() Console.WriteLine(" 2) String.Equals(String)") Console.WriteLine(" * The value of String str2 is ''.", str2) Console.WriteLine(" Is str1 equal to str2?: ", str1.Equals(str2)) Console.WriteLine() Console.WriteLine(" 3) String.Equals(String, String)") Console.WriteLine(" Is str1 equal to str2?: ", [String].Equals(str1, str2)) End Sub End Class ' 'This example produces the following results: ' ' * The value of String str1 is 'abcd'. ' * The value of StringBuilder sb is 'abcd'. ' '1a) String.Equals(Object). Object is a StringBuilder, not a String. ' Is str1 equal to sb?: False ' '1b) String.Equals(Object). Object is a String. ' * The value of Object o2 is 'abcd'. ' Is str1 equal to o2?: True ' ' 2) String.Equals(String) ' * The value of String str2 is 'abcd'. ' Is str1 equal to str2?: True ' ' 3) String.Equals(String, String) ' Is str1 equal to str2?: True ' 

Комментарии

Этот метод выполняет порядковый номер (с учетом регистра и без учета языка и региональных параметров).

См. также раздел

  • Object
  • CompareOrdinal(String, String)

Применяется к

Equals(String)

Определяет, равны ли значения этого экземпляра и указанного объекта String.

public: virtual bool Equals(System::String ^ value);
public: bool Equals(System::String ^ value);
public bool Equals (string value);
public bool Equals (string? value);
override this.Equals : string -> bool
Public Function Equals (value As String) As Boolean
Параметры

Строка для сравнения с данным экземпляром.

Возвращаемое значение

true , если значение параметра value совпадает со значением данного экземпляра; в противном случае — false . Если значением параметра value является null , метод возвращает false .

Реализации

Примеры

В следующем примере демонстрируется Equals метод. Он сравнивает заглавное слово «Файл» с эквивалентным словом, его эквивалентом в нижнем регистре, эквивалентом в верхнем регистре и словом, содержащим латинскую маленькую букву DOTLESS I (U+0131), а не латинскую маленькую букву I (U+0069). Equals(String) Так как метод выполняет порядковый номер сравнения, только сравнение с идентичным словом возвращает . true

using System; public class Example < public static void Main() < Console.OutputEncoding = System.Text.Encoding.UTF8; string word = "File"; string[] others = < word.ToLower(), word, word.ToUpper(), "Fıle" >; foreach (string other in others) < if (word.Equals(other)) Console.WriteLine("= ", word, other); else Console.WriteLine("  ", word, '\u2260', other); > > > // The example displays the following output: // File ≠ file // File = File // File ≠ FILE // File ≠ Fıle 
open System Console.OutputEncoding = " else printfn $" \u2260 " // The example displays the following output: // File ≠ file // File = File // File ≠ FILE // File ≠ Fıle 
Module Example Public Sub Main() Console.OutputEncoding = System.Text.Encoding.UTF8 Dim word As String = "File" Dim others() As String = < word.ToLower(), word, word.ToUpper(), _ "Fıle" >For Each other As String In others If word.Equals(other) Then Console.WriteLine(" = ", word, other) Else Console.WriteLine("  ", word, ChrW(&H2260), other) End If Next End Sub End Module ' The example displays the following output: ' File ≠ file ' File = File ' File ≠ FILE ' File ≠ Fıle 

Комментарии

Этот метод выполняет порядковый номер (с учетом регистра и без учета языка и региональных параметров).

См. также раздел

Применяется к

Equals(String, String)

Определяет, совпадают ли значения двух указанных объектов String.

public: static bool Equals(System::String ^ a, System::String ^ b);
public static bool Equals (string a, string b);
public static bool Equals (string? a, string? b);
static member Equals : string * string -> bool
Public Shared Function Equals (a As String, b As String) As Boolean
Параметры

Первая сравниваемая строка или значение null .

Вторая сравниваемая строка или значение null .

Возвращаемое значение

Значение true , если значение параметра a совпадает со значением b ; в противном случае — значение false . Если оба параметра a и b имеют значение null , метод возвращает значение true .

Примеры

В следующем примере демонстрируется Equals метод.

// Sample for String::Equals(Object) // String::Equals(String) // String::Equals(String, String) using namespace System; using namespace System::Text; int main() < StringBuilder^ sb = gcnew StringBuilder( "abcd" ); String^ str1 = "abcd"; String^ str2 = nullptr; Object^ o2 = nullptr; Console::WriteLine(); Console::WriteLine( " * The value of String str1 is ''.", str1 ); Console::WriteLine( " * The value of StringBuilder sb is ''.", sb ); Console::WriteLine(); Console::WriteLine( "1a) String::Equals(Object). Object is a StringBuilder, not a String." ); Console::WriteLine( " Is str1 equal to sb?: ", str1->Equals( sb ) ); Console::WriteLine(); Console::WriteLine( "1b) String::Equals(Object). Object is a String." ); str2 = sb->ToString(); o2 = str2; Console::WriteLine( " * The value of Object o2 is ''.", o2 ); Console::WriteLine( " Is str1 equal to o2?: ", str1->Equals( o2 ) ); Console::WriteLine(); Console::WriteLine( " 2) String::Equals(String)" ); Console::WriteLine( " * The value of String str2 is ''.", str2 ); Console::WriteLine( " Is str1 equal to str2?: ", str1->Equals( str2 ) ); Console::WriteLine(); Console::WriteLine( " 3) String::Equals(String, String)" ); Console::WriteLine( " Is str1 equal to str2?: ", String::Equals( str1, str2 ) ); > /* This example produces the following results: * The value of String str1 is 'abcd'. * The value of StringBuilder sb is 'abcd'. 1a) String::Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: False 1b) String::Equals(Object). Object is a String. * The value of Object o2 is 'abcd'. Is str1 equal to o2?: True 2) String::Equals(String) * The value of String str2 is 'abcd'. Is str1 equal to str2?: True 3) String::Equals(String, String) Is str1 equal to str2?: True */ 
// Sample for String.Equals(Object) // String.Equals(String) // String.Equals(String, String) using System; using System.Text; class Sample1 < public static void Main() < StringBuilder sb = new StringBuilder("abcd"); String str1 = "abcd"; String str2 = null; Object o2 = null; Console.WriteLine(); Console.WriteLine(" * The value of String str1 is ''.", str1); Console.WriteLine(" * The value of StringBuilder sb is ''.", sb.ToString()); Console.WriteLine(); Console.WriteLine("1a) String.Equals(Object). Object is a StringBuilder, not a String."); Console.WriteLine(" Is str1 equal to sb?: ", str1.Equals(sb)); Console.WriteLine(); Console.WriteLine("1b) String.Equals(Object). Object is a String."); str2 = sb.ToString(); o2 = str2; Console.WriteLine(" * The value of Object o2 is ''.", o2); Console.WriteLine(" Is str1 equal to o2?: ", str1.Equals(o2)); Console.WriteLine(); Console.WriteLine(" 2) String.Equals(String)"); Console.WriteLine(" * The value of String str2 is ''.", str2); Console.WriteLine(" Is str1 equal to str2?: ", str1.Equals(str2)); Console.WriteLine(); Console.WriteLine(" 3) String.Equals(String, String)"); Console.WriteLine(" Is str1 equal to str2?: ", String.Equals(str1, str2)); > > /* This example produces the following results: * The value of String str1 is 'abcd'. * The value of StringBuilder sb is 'abcd'. 1a) String.Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: False 1b) String.Equals(Object). Object is a String. * The value of Object o2 is 'abcd'. Is str1 equal to o2?: True 2) String.Equals(String) * The value of String str2 is 'abcd'. Is str1 equal to str2?: True 3) String.Equals(String, String) Is str1 equal to str2?: True */ 
// Sample for String.Equals(Object) // String.Equals(String) // String.Equals(String, String) open System open System.Text let sb = StringBuilder "abcd" let str1 = "abcd" let str2 = string sb let o2: obj = str2 printfn $""" * The value of String str1 is ''. * The value of StringBuilder sb is ''. 1a) String.Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: " 1b) String.Equals(Object). Object is a String. * The value of Object o2 is ''. Is str1 equal to o2?: 2) String.Equals(String) * The value of String str2 is ''. Is str1 equal to str2?: 3) String.Equals(String, String) Is str1 equal to str2?: """ (* This example produces the following results: * The value of String str1 is 'abcd'. * The value of StringBuilder sb is 'abcd'. 1a) String.Equals(Object). Object is a StringBuilder, not a String. Is str1 equal to sb?: False 1b) String.Equals(Object). Object is a String. * The value of Object o2 is 'abcd'. Is str1 equal to o2?: True 2) String.Equals(String) * The value of String str2 is 'abcd'. Is str1 equal to str2?: True 3) String.Equals(String, String) Is str1 equal to str2?: True *) 
' Sample for String.Equals(Object) ' String.Equals(String) ' String.Equals(String, String) Imports System.Text Class Sample Public Shared Sub Main() Dim sb As New StringBuilder("abcd") Dim str1 As [String] = "abcd" Dim str2 As [String] = Nothing Dim o2 As [Object] = Nothing Console.WriteLine() Console.WriteLine(" * The value of String str1 is ''.", str1) Console.WriteLine(" * The value of StringBuilder sb is ''.", sb.ToString()) Console.WriteLine() Console.WriteLine("1a) String.Equals(Object). Object is a StringBuilder, not a String.") Console.WriteLine(" Is str1 equal to sb?: ", str1.Equals(sb)) Console.WriteLine() Console.WriteLine("1b) String.Equals(Object). Object is a String.") str2 = sb.ToString() o2 = str2 Console.WriteLine(" * The value of Object o2 is ''.", o2) Console.WriteLine(" Is str1 equal to o2?: ", str1.Equals(o2)) Console.WriteLine() Console.WriteLine(" 2) String.Equals(String)") Console.WriteLine(" * The value of String str2 is ''.", str2) Console.WriteLine(" Is str1 equal to str2?: ", str1.Equals(str2)) Console.WriteLine() Console.WriteLine(" 3) String.Equals(String, String)") Console.WriteLine(" Is str1 equal to str2?: ", [String].Equals(str1, str2)) End Sub End Class ' 'This example produces the following results: ' ' * The value of String str1 is 'abcd'. ' * The value of StringBuilder sb is 'abcd'. ' '1a) String.Equals(Object). Object is a StringBuilder, not a String. ' Is str1 equal to sb?: False ' '1b) String.Equals(Object). Object is a String. ' * The value of Object o2 is 'abcd'. ' Is str1 equal to o2?: True ' ' 2) String.Equals(String) ' * The value of String str2 is 'abcd'. ' Is str1 equal to str2?: True ' ' 3) String.Equals(String, String) ' Is str1 equal to str2?: True ' 

Комментарии

Этот метод выполняет порядковый номер (с учетом регистра и без учета языка и региональных параметров).

См. также раздел

Применяется к

Equals(String, StringComparison)

Определяет, равны ли значения этой строки и указанного объекта String. Параметр определяет язык и региональные параметры, учет регистра и правила сортировки, используемые при сравнении.

public: bool Equals(System::String ^ value, StringComparison comparisonType);
public bool Equals (string value, StringComparison comparisonType);
public bool Equals (string? value, StringComparison comparisonType);
override this.Equals : string * StringComparison -> bool
Public Function Equals (value As String, comparisonType As StringComparison) As Boolean
Параметры

Строка для сравнения с данным экземпляром.

comparisonType StringComparison

Одно из значений перечисления, задающее способ сравнения строк.

Возвращаемое значение

true , если значение параметра value совпадает со значением данной строки; в противном случае — false .

Исключения

comparisonType не является значением StringComparison.

Примеры

В следующем примере создается строковый массив, состоящий из прописных букв «I», нижнего регистра «i» и «ı» без точки. Затем он вызывает Equals(String, StringComparison) метод для сравнения с использованием каждого возможного StringComparison значения перечисления.

using System; class Sample < public static void Main() < // Define a string array with the following three "I" characters: // U+0069, U+0131, and U+0049. string[] threeIs = < "i", "ı", "I" >; // Define Type object representing StringComparison type. Type scType = typeof(StringComparison); // Show the current culture (for culture-sensitive string comparisons). Console.WriteLine("The current culture is .\n", System.Globalization.CultureInfo.CurrentCulture.Name); // Perform comparisons using each StringComparison member. foreach (string scName in Enum.GetNames(scType)) < StringComparison sc = (StringComparison) Enum.Parse(scType, scName); Console.WriteLine("Comparisons using :", sc); // Compare each character in character array. for (int ctr = 0; ctr <= 1; ctr++) < string instanceChar = threeIs[ctr]; for (int innerCtr = ctr + 1; innerCtr <= threeIs.GetUpperBound(0); innerCtr++) < string otherChar = threeIs[innerCtr]; Console.WriteLine("(U+) = (U+): ", instanceChar, Convert.ToInt16(Char.Parse(instanceChar)).ToString("X4"), otherChar, Convert.ToInt16(Char.Parse(otherChar)).ToString("X4"), instanceChar.Equals(otherChar, sc)); > Console.WriteLine(); > > > > // The example displays the following output: // The current culture is en-US. // // Comparisons using CurrentCulture: // i (U+0069) = ı (U+0131): False // i (U+0069) = I (U+0049): False // // ı (U+0131) = I (U+0049): False // // Comparisons using CurrentCultureIgnoreCase: // i (U+0069) = ı (U+0131): False // i (U+0069) = I (U+0049): True // // ı (U+0131) = I (U+0049): False // // Comparisons using InvariantCulture: // i (U+0069) = ı (U+0131): False // i (U+0069) = I (U+0049): False // // ı (U+0131) = I (U+0049): False // // Comparisons using InvariantCultureIgnoreCase: // i (U+0069) = ı (U+0131): False // i (U+0069) = I (U+0049): True // // ı (U+0131) = I (U+0049): False // // Comparisons using Ordinal: // i (U+0069) = ı (U+0131): False // i (U+0069) = I (U+0049): False // // ı (U+0131) = I (U+0049): False // // Comparisons using OrdinalIgnoreCase: // i (U+0069) = ı (U+0131): False // i (U+0069) = I (U+0049): True // // ı (U+0131) = I (U+0049): False 
open System open System.Globalization // Define a string array with the following three "I" characters: // U+0069, U+0131, and U+0049. let threeIs = [| "i"; "ı"; "I" |] // Define Type object representing StringComparison type. let scType = typeof // Show the current culture (for culture-sensitive string comparisons). printfn $"The current culture is .\n" // Perform comparisons using each StringComparison member. for scName in Enum.GetNames scType do let sc = Enum.Parse(scType, scName) :?> StringComparison printfn $"Comparisons using :" // Compare each character in character array. for ctr = 0 to 1 do let instanceChar = threeIs[ctr] for innerCtr = ctr + 1 to threeIs.GetUpperBound 0 do let otherChar = threeIs[innerCtr] printfn $" (U+) = (U+): " printfn "" // The example displays the following output: // The current culture is en-US. // // Comparisons using CurrentCulture: // i (U+0069) = i (U+0131): False // i (U+0069) = I (U+0049): False // // i (U+0131) = I (U+0049): False // // Comparisons using CurrentCultureIgnoreCase: // i (U+0069) = i (U+0131): False // i (U+0069) = I (U+0049): True // // i (U+0131) = I (U+0049): False // // Comparisons using InvariantCulture: // i (U+0069) = i (U+0131): False // i (U+0069) = I (U+0049): False // // i (U+0131) = I (U+0049): False // // Comparisons using InvariantCultureIgnoreCase: // i (U+0069) = i (U+0131): False // i (U+0069) = I (U+0049): True // // i (U+0131) = I (U+0049): False // // Comparisons using Ordinal: // i (U+0069) = i (U+0131): False // i (U+0069) = I (U+0049): False // // i (U+0131) = I (U+0049): False // // Comparisons using OrdinalIgnoreCase: // i (U+0069) = i (U+0131): False // i (U+0069) = I (U+0049): True // // i (U+0131) = I (U+0049): False 
Class Sample Public Shared Sub Main() ' Define a string array with the following three "I" characters: ' U+0069, U+0131, and U+0049. Dim threeIs() As String = < "i", "ı", "I" >' Define Type object representing StringComparison type. Dim scType As Type = GetType(StringComparison) ' Show the current culture (for culture-sensitive string comparisons). Console.WriteLine("The current culture is ." & vbCrLf, _ System.Globalization.CultureInfo.CurrentCulture.Name) ' Perform comparisons using each StringComparison member. For Each scName As String In [Enum].GetNames(scType) Dim sc As StringComparison = [Enum].Parse(scType, scName) Console.WriteLine("Comparisons using :", sc) ' Compare each character in character array. For ctr As Integer = 0 To 1 Dim instanceChar As String = threeIs(ctr) For innerCtr As Integer = ctr + 1 To threeIs.GetUpperBound(0) Dim otherChar As STring = threeIs(innerCtr) Console.WriteLine(" (U+) = (U+): ", _ instanceChar, Convert.ToInt16(Char.Parse(instanceChar)).ToString("X4"), _ otherChar, Convert.ToInt16(Char.Parse(otherChar)).ToString("X4"), _ instanceChar.Equals(otherChar, sc)) Next Console.WriteLine() Next Next End Sub End Class ' The example displays the following output: ' The current culture is en-US. ' ' Comparisons using CurrentCulture: ' i (U+0069) = i (U+0131): False ' i (U+0069) = I (U+0049): False ' ' i (U+0131) = I (U+0049): False ' ' Comparisons using CurrentCultureIgnoreCase: ' i (U+0069) = i (U+0131): False ' i (U+0069) = I (U+0049): True ' ' i (U+0131) = I (U+0049): False ' ' Comparisons using InvariantCulture: ' i (U+0069) = i (U+0131): False ' i (U+0069) = I (U+0049): False ' ' i (U+0131) = I (U+0049): False ' ' Comparisons using InvariantCultureIgnoreCase: ' i (U+0069) = i (U+0131): False ' i (U+0069) = I (U+0049): True ' ' i (U+0131) = I (U+0049): False ' ' Comparisons using Ordinal: ' i (U+0069) = i (U+0131): False ' i (U+0069) = I (U+0049): False ' ' i (U+0131) = I (U+0049): False ' ' Comparisons using OrdinalIgnoreCase: ' i (U+0069) = i (U+0131): False ' i (U+0069) = I (U+0049): True ' ' i (U+0131) = I (U+0049): False 

Комментарии

Параметр comparisonType указывает, следует ли при сравнении использовать текущий или инвариантный язык и региональные параметры, учитывать или игнорировать регистр двух строк, а также использовать слово или порядковые правила сортировки.

См. также раздел

Применяется к

Equals(String, String, StringComparison)

Определяет, совпадают ли значения двух указанных объектов String. Параметр определяет язык и региональные параметры, учет регистра и правила сортировки, используемые при сравнении.

public: static bool Equals(System::String ^ a, System::String ^ b, StringComparison comparisonType);
public static bool Equals (string a, string b, StringComparison comparisonType);
public static bool Equals (string? a, string? b, StringComparison comparisonType);
static member Equals : string * string * StringComparison -> bool
Public Shared Function Equals (a As String, b As String, comparisonType As StringComparison) As Boolean
Параметры

Первая сравниваемая строка или значение null .

Вторая сравниваемая строка или значение null .

comparisonType StringComparison

Одно из значений перечисления, определяющее правила сравнения.

Возвращаемое значение

true , если значения параметров a и b совпадают; в противном случае — false .

Исключения

comparisonType не является значением StringComparison.

Примеры

В следующем примере сравнивается три набора строк с использованием каждого элемента перечисления StringComparison . В сравнениях используются соглашения английской (США), тайской (Таиланд) и турецкой (Турция). Обратите внимание, что строки «a» и «a-» считаются эквивалентными в языке и региональных параметрах «th-TH», но не в других языках, а «i» и «İ» считаются эквивалентными в языке и региональных параметрах «tr-TR», если регистр игнорируется, но не учитывается в других языках и региональных параметрах.

using System; using System.Globalization; using System.Threading; public class Example3 < public static void Main() < String[] cultureNames = < "en-US", "th-TH", "tr-TR" >; String[] strings1 = < "a", "i", "case", >; String[] strings2 = < "a-", "\u0130", "Case" >; StringComparison[] comparisons = (StringComparison[])Enum.GetValues(typeof(StringComparison)); foreach (var cultureName in cultureNames) < Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName); Console.WriteLine("Current Culture: ", CultureInfo.CurrentCulture.Name); for (int ctr = 0; ctr <= strings1.GetUpperBound(0); ctr++) < foreach (var comparison in comparisons) Console.WriteLine(" = (): ", strings1[ctr], strings2[ctr], comparison, String.Equals(strings1[ctr], strings2[ctr], comparison)); Console.WriteLine(); > Console.WriteLine(); > > > // The example displays the following output: // Current Culture: en-US // a = a- (CurrentCulture): False // a = a- (CurrentCultureIgnoreCase): False // a = a- (InvariantCulture): False // a = a- (InvariantCultureIgnoreCase): False // a = a- (Ordinal): False // a = a- (OrdinalIgnoreCase): False // // i = İ (CurrentCulture): False // i = İ (CurrentCultureIgnoreCase): False // i = İ (InvariantCulture): False // i = İ (InvariantCultureIgnoreCase): False // i = İ (Ordinal): False // i = İ (OrdinalIgnoreCase): False // // case = Case (CurrentCulture): False // case = Case (CurrentCultureIgnoreCase): True // case = Case (InvariantCulture): False // case = Case (InvariantCultureIgnoreCase): True // case = Case (Ordinal): False // case = Case (OrdinalIgnoreCase): True // // // Current Culture: th-TH // a = a- (CurrentCulture): True // a = a- (CurrentCultureIgnoreCase): True // a = a- (InvariantCulture): False // a = a- (InvariantCultureIgnoreCase): False // a = a- (Ordinal): False // a = a- (OrdinalIgnoreCase): False // // i = İ (CurrentCulture): False // i = İ (CurrentCultureIgnoreCase): False // i = İ (InvariantCulture): False // i = İ (InvariantCultureIgnoreCase): False // i = İ (Ordinal): False // i = İ (OrdinalIgnoreCase): False // // case = Case (CurrentCulture): False // case = Case (CurrentCultureIgnoreCase): True // case = Case (InvariantCulture): False // case = Case (InvariantCultureIgnoreCase): True // case = Case (Ordinal): False // case = Case (OrdinalIgnoreCase): True // // // Current Culture: tr-TR // a = a- (CurrentCulture): False // a = a- (CurrentCultureIgnoreCase): False // a = a- (InvariantCulture): False // a = a- (InvariantCultureIgnoreCase): False // a = a- (Ordinal): False // a = a- (OrdinalIgnoreCase): False // // i = İ (CurrentCulture): False // i = İ (CurrentCultureIgnoreCase): True // i = İ (InvariantCulture): False // i = İ (InvariantCultureIgnoreCase): False // i = İ (Ordinal): False // i = İ (OrdinalIgnoreCase): False // // case = Case (CurrentCulture): False // case = Case (CurrentCultureIgnoreCase): True // case = Case (InvariantCulture): False // case = Case (InvariantCultureIgnoreCase): True // case = Case (Ordinal): False // case = Case (OrdinalIgnoreCase): True 
open System open System.Globalization open System.Threading let cultureNames = [| "en-US"; "se-SE" |] let strings1 = [| "case"; "encyclopædia" "encyclopædia"; "Archæology" |] let strings2 = [| "Case"; "encyclopaedia" "encyclopedia"; "ARCHÆOLOGY" |] let comparisons = Enum.GetValues typeof :?> StringComparison[] for cultureName in cultureNames do Thread.CurrentThread.CurrentCulture " for i = 0 to strings1.GetUpperBound 0 do for comparison in comparisons do printfn $" = (): " printfn "" printfn "" // The example displays the following output: // Current Culture: en-US // case = Case (CurrentCulture): False // case = Case (CurrentCultureIgnoreCase): True // case = Case (InvariantCulture): False // case = Case (InvariantCultureIgnoreCase): True // case = Case (Ordinal): False // case = Case (OrdinalIgnoreCase): True // // encyclopædia = encyclopaedia (CurrentCulture): True // encyclopædia = encyclopaedia (CurrentCultureIgnoreCase): True // encyclopædia = encyclopaedia (InvariantCulture): True // encyclopædia = encyclopaedia (InvariantCultureIgnoreCase): True // encyclopædia = encyclopaedia (Ordinal): False // encyclopædia = encyclopaedia (OrdinalIgnoreCase): False // // encyclopædia = encyclopedia (CurrentCulture): False // encyclopædia = encyclopedia (CurrentCultureIgnoreCase): False // encyclopædia = encyclopedia (InvariantCulture): False // encyclopædia = encyclopedia (InvariantCultureIgnoreCase): False // encyclopædia = encyclopedia (Ordinal): False // encyclopædia = encyclopedia (OrdinalIgnoreCase): False // // Archæology = ARCHÆOLOGY (CurrentCulture): False // Archæology = ARCHÆOLOGY (CurrentCultureIgnoreCase): True // Archæology = ARCHÆOLOGY (InvariantCulture): False // Archæology = ARCHÆOLOGY (InvariantCultureIgnoreCase): True // Archæology = ARCHÆOLOGY (Ordinal): False // Archæology = ARCHÆOLOGY (OrdinalIgnoreCase): True // // // Current Culture: se-SE // case = Case (CurrentCulture): False // case = Case (CurrentCultureIgnoreCase): True // case = Case (InvariantCulture): False // case = Case (InvariantCultureIgnoreCase): True // case = Case (Ordinal): False // case = Case (OrdinalIgnoreCase): True // // encyclopædia = encyclopaedia (CurrentCulture): False // encyclopædia = encyclopaedia (CurrentCultureIgnoreCase): False // encyclopædia = encyclopaedia (InvariantCulture): True // encyclopædia = encyclopaedia (InvariantCultureIgnoreCase): True // encyclopædia = encyclopaedia (Ordinal): False // encyclopædia = encyclopaedia (OrdinalIgnoreCase): False // // encyclopædia = encyclopedia (CurrentCulture): False // encyclopædia = encyclopedia (CurrentCultureIgnoreCase): False // encyclopædia = encyclopedia (InvariantCulture): False // encyclopædia = encyclopedia (InvariantCultureIgnoreCase): False // encyclopædia = encyclopedia (Ordinal): False // encyclopædia = encyclopedia (OrdinalIgnoreCase): False // // Archæology = ARCHÆOLOGY (CurrentCulture): False // Archæology = ARCHÆOLOGY (CurrentCultureIgnoreCase): True // Archæology = ARCHÆOLOGY (InvariantCulture): False // Archæology = ARCHÆOLOGY (InvariantCultureIgnoreCase): True // Archæology = ARCHÆOLOGY (Ordinal): False // Archæology = ARCHÆOLOGY (OrdinalIgnoreCase): True 
Imports System.Globalization Imports System.Threading Module Example Public Sub Main() Dim cultureNames() As String = < "en-US", "se-SE" >Dim strings1() As String = < "case", "encyclopædia", "encyclopædia", "Archæology" >Dim strings2() As String = < "Case", "encyclopaedia", "encyclopedia" , "ARCHÆOLOGY" >Dim comparisons() As StringComparison = CType([Enum].GetValues(GetType(StringComparison)), StringComparison()) For Each cultureName In cultureNames Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName) Console.WriteLine("Current Culture: ", CultureInfo.CurrentCulture.Name) For ctr As Integer = 0 To strings1.GetUpperBound(0) For Each comparison In comparisons Console.WriteLine(" = (): ", strings1(ctr), strings2(ctr), comparison, String.Equals(strings1(ctr), strings2(ctr), comparison)) Next Console.WriteLine() Next Console.WriteLine() Next End Sub End Module ' The example displays the following output: ' Current Culture: en-US ' case = Case (CurrentCulture): False ' case = Case (CurrentCultureIgnoreCase): True ' case = Case (InvariantCulture): False ' case = Case (InvariantCultureIgnoreCase): True ' case = Case (Ordinal): False ' case = Case (OrdinalIgnoreCase): True ' ' encyclopædia = encyclopaedia (CurrentCulture): True ' encyclopædia = encyclopaedia (CurrentCultureIgnoreCase): True ' encyclopædia = encyclopaedia (InvariantCulture): True ' encyclopædia = encyclopaedia (InvariantCultureIgnoreCase): True ' encyclopædia = encyclopaedia (Ordinal): False ' encyclopædia = encyclopaedia (OrdinalIgnoreCase): False ' ' encyclopædia = encyclopedia (CurrentCulture): False ' encyclopædia = encyclopedia (CurrentCultureIgnoreCase): False ' encyclopædia = encyclopedia (InvariantCulture): False ' encyclopædia = encyclopedia (InvariantCultureIgnoreCase): False ' encyclopædia = encyclopedia (Ordinal): False ' encyclopædia = encyclopedia (OrdinalIgnoreCase): False ' ' Archæology = ARCHÆOLOGY (CurrentCulture): False ' Archæology = ARCHÆOLOGY (CurrentCultureIgnoreCase): True ' Archæology = ARCHÆOLOGY (InvariantCulture): False ' Archæology = ARCHÆOLOGY (InvariantCultureIgnoreCase): True ' Archæology = ARCHÆOLOGY (Ordinal): False ' Archæology = ARCHÆOLOGY (OrdinalIgnoreCase): True ' ' ' Current Culture: se-SE ' case = Case (CurrentCulture): False ' case = Case (CurrentCultureIgnoreCase): True ' case = Case (InvariantCulture): False ' case = Case (InvariantCultureIgnoreCase): True ' case = Case (Ordinal): False ' case = Case (OrdinalIgnoreCase): True ' ' encyclopædia = encyclopaedia (CurrentCulture): False ' encyclopædia = encyclopaedia (CurrentCultureIgnoreCase): False ' encyclopædia = encyclopaedia (InvariantCulture): True ' encyclopædia = encyclopaedia (InvariantCultureIgnoreCase): True ' encyclopædia = encyclopaedia (Ordinal): False ' encyclopædia = encyclopaedia (OrdinalIgnoreCase): False ' ' encyclopædia = encyclopedia (CurrentCulture): False ' encyclopædia = encyclopedia (CurrentCultureIgnoreCase): False ' encyclopædia = encyclopedia (InvariantCulture): False ' encyclopædia = encyclopedia (InvariantCultureIgnoreCase): False ' encyclopædia = encyclopedia (Ordinal): False ' encyclopædia = encyclopedia (OrdinalIgnoreCase): False ' ' Archæology = ARCHÆOLOGY (CurrentCulture): False ' Archæology = ARCHÆOLOGY (CurrentCultureIgnoreCase): True ' Archæology = ARCHÆOLOGY (InvariantCulture): False ' Archæology = ARCHÆOLOGY (InvariantCultureIgnoreCase): True ' Archæology = ARCHÆOLOGY (Ordinal): False ' Archæology = ARCHÆOLOGY (OrdinalIgnoreCase): True 

Комментарии

Параметр comparisonType указывает, следует ли при сравнении использовать текущий или инвариантный язык и региональные параметры, учитывать или игнорировать регистр двух строк, а также использовать слово или порядковые правила сортировки.

См. также раздел

Equals() и как работает сравнение типов в C#

Equals() и как работает сравнение типов в C#

Правильное сравнивание типов в .NET всегда является проблемой не только для новичков, но и для опытных разработчиков. Сегодня мы рассмотрим как правильно сравнивать ссылочные (reference) и значимые (value) типы в .NET.

Сравнение типов через Equals() и == в Reference Type

Как работает Equals() в C#

В классе System.Object есть все несколько методов, один из них ReferenceEquals

 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [System.Runtime.Versioning.NonVersionable] public static bool ReferenceEquals (Object objA, Object objB)

Стоить отметить, что == и RefefenceEquals работает идентично, сравнивая ссылки на объекты в heap’е, а значит при выполнении данного кода

 public class Program < public static async Task Main() < var obj1 = new TestClass < Count = 2 >; var obj2 = new TestClass < Count = 2 >; Console.WriteLine(obj1 == obj2); Console.WriteLine(obj1.Equals(obj2)); Console.WriteLine(object.ReferenceEquals(obj1, obj2)); Console.ReadKey(); > > class TestClass < public int Count < get; set; >>

На консоль будет выведено:

False False False

Как работает метод virtual bool Equals, обратимся к исходному коду .NET Framework’a

public virtual bool Equals(Object obj)

По сути за этим для стандартной реализации object.Equals скрывается вызов ReferenceEquals под капотом. При этом определение того, какой метод Equals вызвать определяется на динамическом типе левого аргумента. Например, перепишем наш старый пример, где переопределим метод Equals :

 public class Program < public static async Task Main() < object obj1 = new TestClass < Count = 2 >; object obj2 = new TestClass < Count = 2 >; Console.WriteLine(obj1 == obj2); Console.WriteLine(obj1.Equals(obj2)); Console.WriteLine(object.ReferenceEquals(obj1, obj2)); > > class TestClass < public int Count < get; set; >public override bool Equals(object obj) < if (obj is TestClass objectType) < return this.Count == objectType.Count; >return false; > >

На экране мы увидим:

False True False

equals flowchart

Несмотря на то, что obj1 и obj2 являются типом Object , происходит вызов Equals класса TestClass , тк он переопределен. Механизм выглядит следующим образом: У типа Object есть еще один статический метод static bool Equals(Object objA, Object objB) Его исходный код выглядит следующим образом:

 public static bool Equals(Object objA, Object objB) < if (objA==objB) < return true; >if (objA==null || objB==null) < return false; >return objA.Equals(objB); >

Этот является оберткой виртуального метода Equals, но перед его вызовом, делает проверку равенства ссылок путем == и проверку на null каждого из объектов проверки.

Сравнение Value типов через Equals

Метод ValueType.Equals(Object) переопределяет Object.Equals(Object) и реализует свою функцию, вот исходный код с .NET Framework:

 [Serializable] [System.Runtime.InteropServices.ComVisible(true)] public abstract class ValueType < [System.Security.SecuritySafeCritical] public override bool Equals (Object obj) < BCLDebug.Perf(false, "ValueType::Equals is not fast. "+this.GetType().FullName+" should override Equals(Object)"); if (null==obj) < return false; >RuntimeType thisType = (RuntimeType)this.GetType(); RuntimeType thatType = (RuntimeType)obj.GetType(); if (thatType!=thisType) < return false; >Object thisObj = (Object)this; Object thisResult, thatResult; // if there are no GC references in this object we can avoid reflection // and do a fast memcmp if (CanCompareBits(this)) return FastEqualsCheck(thisObj, obj); FieldInfo[] thisFields = thisType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); for (int i=0; i else if (!thisResult.Equals(thatResult)) < return false; >> return true; >
  1. Проверяет можно ли сделать побитовое сравнение, если да, то выполняется FastEqualsCheck(Object a, Object b);
  2. Если же это не побитовое сравнение, применяется рефлексия, и значения всех полей сравниваются попарно через Equals(object).

Совет:

Если структура содержит поля, которые являются ссылочными типами, следует переопределить метод Equals(Object) . Это может повысить производительность и позволить более точно представить значение равенства для типа. Так как при большом количестве полей, выполнение ValueType.Equals может быть очень затратным по времени. При переопределении так же не забывайте переопределять и метод GetHashCode который используется в таких типах данных как Dictionary для сравнения объектов.

Сравнение с помощью вспомогательных классов и интерфейсов

IEqualityComparer

Если вам нужен метод для сравнения объектов для конкретного типа, а не общей ситуации (или вы хотите сравнивать специальным образом объекты, которые вам не принадлежат), вы можете делегировать сравнение специальному объекту, реализующему интерфейс IEqualityComparer или типизированный IEqualityComparer . Сравнение при помощи таких сравнивающих объектов применяют, например, Hashatable и Dictionary, а также некоторые LINQ-методы.

К этому интерфейсу есть и его реализация с помощью EqualityComparer . EqualityComparer, он проверяет реализует ли объект интерфейс IEquatable , и в противном случае выполняет сравнение через стандартный Equal(object ). При реализации IEqualityComparer рекомендуется наследоваться от EqualityComparer.

 public class Program < public static async Task Main() < var obj1 = new TestClass < Count = 2 >; var obj2 = new TestClass < Count = 2 >; Console.WriteLine(obj1.Equals(obj2)); > > class TestClass : IEqualityComparer  < public int Count < get; set; >public bool Equals(int x, int y) < return x == y; >public int GetHashCode(int obj) < return obj.GetHashCode(); >>

IComparable

Проверка на равенство так же может быть выполнена через сравнение больше/меньше/равно. Для этого используются операторы сравнения , интерфейсы IComparable (аналог метода Equals(object) ), IComparable (аналог интерфейса IEquatable)

public class Program < public static async Task Main() < var obj1 = new TestClass < Count = 2 >; var obj2 = new TestClass < Count = 2 >; Console.WriteLine(obj1.CompareTo(obj2)); > > class TestClass : IComparable  < public int Count < get; set; >public int CompareTo(TestClass other) < return ReferenceEquals(this, other) ? 0 : Count.CompareTo(other.Count); >>

IStructuralEquatable

IStructuralEquatable работает в паре с интерфейсом IEqualityComparer . Интерфейс IStructuralEquatable реализуют такие классы как System.Array или System.Tuple . IStructuralEquality декларирует то, что тип может составлять более крупные объекты, которые реализуют семантику значимых типов и вряд ли когда-либо нам потребуется его самостоятельно реализовывать.

Пример реализации этого интерфейса можно подсмотреть в System.Array :

bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer) < if (other == null) < return false; >if (object.ReferenceEquals(this, other)) < return true; >Array array = other as Array; if (array == null || array.Length != this.Length) < return false; >for (int i = 0; i < array.Length; i++) < object value = this.GetValue(i); object value2 = array.GetValue(i); if (!comparer.Equals(value, value2)) < return false; >> return true; >

Алгоритм реализации такого интерфейса в System.Array прост:

  1. Проверяется объект other на null;
  2. проверяется равенство ссылок;
  3. Поэлементное сравнение с помощью IEqualityComparer.Equals;

Правила реализации метода Equals и оператора равенства (==)

При реализации метода Equals и оператора равенства (==) следует руководствоваться следующим:

  • При реализации метода Equals всегда реализуйте метод GetHashCode . При этом сохраняется синхронизация методов Equals и GetHashCode .
  • Всегда переопределяйте метод Equals при реализации оператора равенства (==). При этом необходимо, чтобы и оператор, и метод выполняли одну функцию. Это позволит специфическим типам, таким как Hashtable и ArrayList, использующему метод Equals , работать таким же образом, как и переопределенная операция равенства.
  • Переопределяйте метод Equals каждый раз при реализации IComparable .
  • При реализации интерфейса IComparable рекомендуется реализовать перегрузку оператора для операторов «равенство» (==), «неравенство» (!=), «меньше чем» (<) и "больше чем" (>).
  • Не вызывайте исключения из методов Equals и GetHashCode или оператора равенства (==).

Источники и дополнительная информация:

  1. Сравнение объектов в C#.NET
  2. Чем отличаются оператор == и вызов метода object.Equals в C#?
  3. ValueType.Equals(Object)
  4. Правила реализации метода Equals и оператора равенства (==)
  5. System.Object
  6. ValueType

Комментарии:

Пожалуйста авторизируйтесь, чтобы получить возможность оставлять комментарии
03.04.2023 11:43

mcfly, вы правы в том что его можно использовать в других LINQ выражениях, о чем я упоминал в статье, но тк статья сосредоточена на Equals и как сравнивать типы, то пример в этом ключе рассматривался.

14.03.2023 05:56

В коде с IEqualityComparer написана чушь. Работает IEqualityComparer как-то так : public class IntEqualityComparer : IEqualityComparer < public bool Equals(int x, int y) < return x == y; >public int GetHashCode([DisallowNull] int obj) < return obj.GetHashCode(); >> public void Main() < int[] vals = < 1, 3, 1, 4, 3, 5, 12, 4, 4, 4 >; Console.WriteLine(string.Join(«, «, vals.Distinct(new IntEqualityComparer()))); > на выходе будет : 1, 3, 4, 5, 12 Т.е. сам класс, реализующий IEqualityComparer можно подкидывать в разные Linq выражения (Sort, Distinct и т.д.) и прочие места, где требуется IEqualityComparer и сравниваться будет так, как реализовано в вашем классе.

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode

Метод equals в Java

Часто при программировании нам приходиться проверять равенство объектов. Но как же работает сравнение объектов в языке Java? Расскажем вам в этой статье.

Метод equals в Java

Статья ориентирована на читателей среднего уровня подготовки Java.

Сравнение с помощью == и equals в Java

Приведем пример программного кода:

String s1 = new String ( «vscode.ru» ) ;
String s2 = new String ( «vscode.ru» ) ;
System . out . println ( s1 == s2 ) ; //каким здесь будет результат сравнения?
System . out . println ( s1 . equals ( s2 ) ) ; //а здесь?

Но, в чем же разница между этими двумя записями? Какое отличие между оператором сравнения == и методом equals?

Все очень просто. Метод equals в Java при сравнении проверяет и сопоставляет само содержимое объектов (их значения) и на основе этого делает заключение равны они (true) или нет (false).

Оператор == (в случае с примитивными типами данных) сравнивает значения переменных и возвращает результат, НО в случае со ссылочными типами данных (объекты, массивы и т.д.) сравнивает ссылки на объекты в памяти компьютера, и на основании равенства или неравенства ссылок возвращает результат (true или false). Вот в чём отличие метода equals и оператора ==.

Вы можете почитать подробную статью про оба вида типов данных и их различия в соответствующей статье.

Метод equals — это метод класса Object. Каждый объект неявно унаследован от класса Object и они могут вызывать метод equals.

Возвращаясь к примеру, приведенному в начале подраздела, можно сделать вывод о том, каким будет результат операции сравнения в обоих случаях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *