==와 동등한 값 사이의 C# 차이()
실버라이트 어플리케이션에서 2개의 스트링을 비교하는 조건이 있는데, 어떤 이유로 사용할 때==
다음 시간 동안 거짓으로 반환됩니다..Equals()
true를 반환합니다.
코드는 다음과 같습니다.
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
왜 이런 일이 일어나는지에 대한 이유가 있습니까?
때==
유형의 표현식에 사용됩니다.object
로 해결될 것입니다.
Equals
그냥.virtual
이 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ",string
type은 내용을 비교합니다.
때하더라도), ▁behavior오▁the▁of▁when▁special,==
문자열 클래스와 관련된 연산자는 무시됩니다.
때), 일적끈로으 (때다지않을루즉을, 반,즉),Equals
값을 비교하는 동안==
개체 참조를 비교합니다.비교 중인 두 개체가 개체의 동일한 인스턴스를 참조하는 경우 둘 다 true를 반환하지만 한 개체의 내용이 같고 다른 소스(같은 데이터를 가진 별도의 인스턴스)에서 가져온 경우 Equals만 true를 반환합니다.그러나 코멘트에서 언급한 바와 같이 문자열은 다음을 재정의하므로 특수한 경우입니다.==
연산자를 사용하여 문자열 참조(객체 참조가 아닌)를 순수하게 처리할 때 값이 개별 인스턴스인 경우에도 값만 비교됩니다.다음 코드는 동작의 미묘한 차이를 보여줍니다.
string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3; // Notice: set to object variable!
Console.WriteLine($"{object.ReferenceEquals(s1, s2)} {s1 == s2} {s1.Equals(s2)}");
Console.WriteLine($"{object.ReferenceEquals(s1, s3)} {s1 == s3} {s1.Equals(s3)}");
Console.WriteLine($"{object.ReferenceEquals(s1, s4)} {s1 == s4} {s1.Equals(s4)}");
출력은 다음과 같습니다.
True True True // s1, s2
False True True // s1, s3
False False True // s1, s4
요약:.
변수 | .참조등호 | == | .평등 |
---|---|---|---|
s1, s2 | 진실의 | 진실의 | 진실의 |
s1, s3 | 거짓의 | 진실의 | 진실의 |
s1, s4 | 거짓의 | 거짓의 | 진실의 |
==
그리고..Equals
둘 다 실제 유형과 콜 사이트의 실제 유형에 정의된 동작에 따라 달라집니다.둘 다 모든 유형에서 재정의될 수 있고 작성자가 원하는 모든 동작이 주어질 수 있는 메소드/연산자일 뿐입니다.제 경험으로 볼 때, 저는 사람들이 일반적으로 구현하는 것이.Equals
어떤 대상에 대하여 그러나 연산자를 실행하는 것을 게을리 합니다.==
은 즉을 합니다..Equals
실제로 값의 동일성을 측정하는 동안==
두 값이 동일한 기준인지 여부를 측정합니다.
정의가 유동적인 새로운 유형으로 작업하거나 일반 알고리즘을 작성할 때 가장 좋은 방법은 다음과 같습니다.
- 제가 C#의 , 저는 C# 참조비용다사다니합음을면려를 합니다.
Object.ReferenceEquals
에는 필요하지 않음) 일접인 (적경필않지음하요직는에우반 - 하려면 사하는값비경는우려하교를 합니다.
EqualityComparer<T>.Default
어떤 경우에는 의 사용법을 느낄 때도 있습니다.==
. 으로 모합니다를 하겠습니다. 명시적으로 사용하겠습니다.Object.Reference
모호성을 제거하기 위해 코드에서 동등합니다.
에릭 리퍼트는 최근 CLR에 평등의 두 가지 방법이 있는 이유에 대해 블로그에 글을 올렸습니다.읽을 가치가 있습니다.
연산자
- 피연산자가 값 유형이고 값이 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 피연산자가 문자열을 제외한 참조 유형이고 둘 다 동일한 인스턴스(동일한 개체)를 참조하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 피연산자가 문자열 유형이고 값이 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
.평등
- 피연산자가 참조 유형이면 참조 동일성을 수행합니다. 즉, 두 피연산자가 모두 동일한 인스턴스(동일한 개체)를 참조하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 피연산자가 값 유형인 경우 == 연산자와 달리 먼저 유형을 확인하고 유형이 동일한 경우 == 연산자를 수행하며 그렇지 않으면 false를 반환합니다.
제가 이해하기로는 답은 간단합니다.
==
개체 참조를 비교합니다..Equals
개체 콘텐츠를 비교합니다.String
데이터 유형은 항상 내용 비교와 같은 역할을 합니다.
제가 맞았고 당신의 질문에 답이 됐기를 바랍니다.
첫째, 차이점이 있습니다.숫자의 경우
> 2 == 2.0
True
> 2.Equals(2.0)
False
그리고 현악기는.
> string x = null;
> x == null
True
> x.Equals(null)
NullReferenceException
모두, 두경우모두,,==
보다 유용하게 동작합니다..Equals
저는 만약 당신이 당신의 객체를 문자열에 캐스팅한다면 그것은 올바르게 작동할 것이라고 덧붙이고 싶습니다.이것이 컴파일러가 다음과 같은 경고를 제공하는 이유입니다.
의도하지 않은 참조 비교가 가능합니다. 값을 비교하려면 왼쪽을 'string' 유형으로 캐스팅하십시오.
왜냐하면 정적 버전의.Equal
방법은 지금까지 언급되지 않았습니다, 저는 여기에 세 가지 변형을 요약하고 비교하기 위해 이것을 추가하고 싶습니다.
MyString.Equals("Somestring")) //Method 1
MyString == "Somestring" //Method 2
String.Equals("Somestring", MyString); //Method 3 (static String.Equals method) - better
MyString
코드의 다른 위치에서 온 변수입니다.
배경 정보 및 요약:
를 사용하는 에서는.==
문자열을 비교하는 데 사용하면 안 됩니다. 언어를 해야 할 에 대비해서 하는 것을 합니다.==
C#에서 더 나은 것으로 대체할 수도 있습니다.
C#에서는 메소드 1 또는 메소드 2를 사용하여 문자열을 비교하는 데 실질적인 차이가 없습니다.그러나 하나가 null이거나(정수와 같은) 다른 유형이거나 참조가 다른 개체를 나타내는 경우에는 처음 질문에서 알 수 있듯이 내용을 동일하게 비교하면 기대한 것을 반환하지 않을 수 있습니다.
제안 솔루션:
사하기때에를 사용하기 입니다.==
를 사용하는 것과 정확히 동일하지 않습니다..Equals
비교할 때 정적 문자열을 사용할 수 있습니다.대신 동일한 방법입니다.이렇게 하면 양쪽이 동일한 유형이 아닌 경우에도 내용을 비교하고 한쪽이 null인 경우에는 예외를 방지할 수 있습니다.
bool areEqual = String.Equals("Somestring", MyString);
쓰기에는 조금 더 많지만, 제 생각에는 사용하기에 더 안전합니다.
다음은 Microsoft에서 복사한 몇 가지 정보입니다.
public static bool Equals (string a, string b);
매개변수
a
»
첫 비할첫 문자열번, 는null
.
b
»
두 비할두번문자열, 또는.null
.
온다아를 반환합니다.Boolean
true
의가가 있면다의 a
는 의 값 같 습 니다과의 .b
않으면, 않지으면그렇,false
둘 다인 경우a
그리고.b
null
는 메드가반니다됩환을 합니다.true
.
이미 좋은 답변에 추가된 것처럼:이 동작은 문자열 또는 서로 다른 번호 유형을 비교하는 것으로 제한되지 않습니다.두 요소가 동일한 기본 유형의 유형 개체인 경우에도 마찬가지입니다.작동하지 않습니다.
다음 스크린샷에는 두 개체 {int} - 값을 비교한 결과가 나와 있습니다.
저는 여기서 조금 혼란스럽습니다.컨텐츠의 런타임 유형이 문자열 유형인 경우 == 및 동등한 값이 모두 true를 반환해야 합니다.그러나 그렇지 않은 것처럼 보이므로 내용의 런타임 유형이 문자열이 아니며 내용에서 동등을 호출하는 것은 참조 평등을 수행하는 것이며, 이것이 동등("에너지 공격")이 실패하는 이유를 설명합니다.그러나 두 번째 경우 오버로드된 == 정적 연산자를 호출해야 하는지에 대한 결정은 컴파일 시에 이루어지며, 이 결정은 ==(string, string)로 나타납니다.이는 내용이 문자열로 암시적 변환을 제공한다는 것을 의미합니다.
@BlueMonkMN의 이전 답변에는 또 다른 차원이 있습니다.추가적인 차원은 언급된 @Drahcir의 제목 질문에 대한 대답도 우리가 어떻게 도착했는지에 달려 있다는 것입니다.string
를 들어 설명합니다. 설명하기:
string s1 = "test";
string s2 = "test";
string s3 = "test1".Substring(0, 4);
object s4 = s3;
string s5 = "te" + "st";
object s6 = s5;
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s2), s1 == s2, s1.Equals(s2));
Console.WriteLine("\n Case1 - A method changes the value:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s3), s1 == s3, s1.Equals(s3));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s4), s1 == s4, s1.Equals(s4));
Console.WriteLine("\n Case2 - Having only literals allows to arrive at a literal:");
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s5), s1 == s5, s1.Equals(s5));
Console.WriteLine("{0} {1} {2}", object.ReferenceEquals(s1, s6), s1 == s6, s1.Equals(s6));
출력은 다음과 같습니다.
True True True
Case1 - A method changes the value:
False True True
False False True
Case2 - Having only literals allows to arrive at a literal:
True True True
True True True
답변에 1점을 더 추가합니다.
.EqualsTo()
메소드는 문화 및 대/소문자를 구분하여 비교할 수 있는 프로비저닝을 제공합니다.
정말 훌륭한 답변과 예시들!
둘 사이의 근본적인 차이점을 말씀드리고 싶습니다
연은산과
==
에 다성은아니만지에, 면반형▁are에.Equals
이라
이 개념을 염두에 두고, 예를 들어 (왼쪽과 오른쪽 참조 유형을 보고 해당 유형에 실제로 == 연산자가 오버로드되어 있고 Equals가 오버라이드되어 있는지 확인/수정하여) 올바른 답을 얻을 수 있습니다.
이는 동일한 방법이 동일한 ==이 기준을 확인하는 동안 동일한 방법이 값을 확인하기 때문에 값 동일성(측정법)과 기준 동일성(== 연산자) 때문입니다.
https://referencesource.microsoft.com/ 의 문자열 클래스 내에서 사용 가능한 코드를 재정의하는 연산자
이제 이해하기가 더 쉬워졌습니다. 동일한 메소드는 문자열 클래스 자체와 객체 클래스에서 각각 하나씩 2개의 구현을 가지고 있습니다.성능에 미치는 영향 또한 기본 코드를 실행하고 벤치마크를 이해하려고 노력합니다.
아래의 결과를 공유합니다. 제가 틀린 부분이 있으면 수정하거나 조언해주세요.3건의 사례가 있고 저는 모든 사례에 대해 동일한 코드를 실행했고 이것이 결과입니다.
사례 1: 여기서 저는 끈을 사용하고 있습니다.두 문자열을 비교하는 동일한 방법과 두 문자열의 값이 동일합니다.string.b(a,b)
첫 번째 주행: 4808195 틱
2차 주행: 5529387 틱
3차 주행: 5622569 틱
총 눈금: 16760151
사례 2: 여기서 저는 끈을 사용하고 있습니다.2개의 문자열을 비교하기 위한 equal()method(하나로 표시됨)와 두 문자열 모두 동일한 값을 갖습니다. a.tg(b)
첫 번째 주행: 6738583 틱
2차 주행: 6452927 틱
3차 주행: 7168897 틱
총 눈금 = 20360407
사례 3: 여기서 == 연산자를 사용하여 두 문자열을 비교하고 두 문자열의 값이 동일합니다.a==b
첫 번째 주행: 6652151 틱
2차 주행: 7514300 틱
3차 주행: 7634606 틱
총 눈금 = 21801057
class Program
{
private static int count;
static string a = "abcdef";
static string b = "abcdef";
static void Main(string[] args)
{
for (int j = 1; j <= 3; j++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 1; i <= 1000; i++)
{
checkString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
}
Console.ReadLine();
}
public static void checkString()
{
for (int i = 1; i <= 100000; i++)
{
if (a==b)
count++;
}
}
}
그==
C#의 토큰은 두 개의 서로 다른 동일성 검사 연산자에 사용됩니다.컴파일러가 해당 토큰을 발견하면 비교 중인 유형 중 하나가 비교 중인 특정 조합 유형(*) 또는 두 유형을 모두 변환할 수 있는 유형의 조합에 대해 동등 연산자 오버로드를 구현했는지 확인합니다.컴파일러가 이러한 오버로드를 찾으면 이를 사용합니다. 두 이 없는 클래스도 있음)가는 그지않으면, 두모인참유조클관없스형가래두련는고이이렇있아것수수음니고니다입같관있려할클이라다과컴면음는러일파도고련일스래일도스이터페형이유▁otherwise▁regard),▁if▁(▁are▁will▁and▁types▁compiler것,▁the고가▁types▁the인니다입같그려할이▁two다아과음니▁both는라▁reference렇▁theyeither러컴▁classes,▁classes일==
기준 비교 연산자로서.두 가지 조건이 모두 적용되지 않으면 컴파일이 실패합니다.
일부 다른 언어는 두 동일성 검사 연산자에 대해 별도의 토큰을 사용합니다.들어 에서는 를들어 VB를 합니다.NET에서는=
토큰은 오버로드 가능한 등식 검사 연산자에 대해서만 식 내에서 사용됩니다.Is
는 참조 테스트 또는 null 테스트 연산자로 사용됩니다.를 사용하려면 A를 합니다.=
동성검연재않지유는사형할는고다때려실니용합패하서에하일정의를자사산을 하려고 시도합니다.Is
기준 동등성 또는 무효성을 테스트하는 것 이외의 목적으로.
으로 유형은를 위해 한 연산자를 유형과 하기 위해 할 수 . 를 들어 (*) 일반 유하 것드 다지 비 연 유 위 오 것 유 있 다 니 습 할 용 수 이 는하드로 버 를자산동한일해기하교특과형정른적만형으일로만버해동위로한오교신자은비를 과 의 ▁(* ▁to ) types ▁for 예를 들어,int
는 ( 과의 그위해동를교 (IMHO ") ▁forho▁operators▁could다▁an▁compar▁equality▁haveison▁didn▁have니있▁defined▁with▁(and그수습과었▁but▁im의)ho▁should동과 비교하기 위해 동등 연산자를 정의할 수 정의하지 않았습니다float
16777217과 합니다.현재로서는, 그러한 연산자가 정의되어 있지 않기 때문에, C#은 다음을 촉진할 것입니다.int
float
등식 검사 연산자가 보기 전에 16777216f로 반올림합니다. 그러면 등식 검사 연산자는 두 개의 동일한 부동 소수점 번호를 보고 반올림이 발생한 것을 알지 못한 채 동일한 것으로 보고합니다.
C#에는 두 가지 다른 유형의 동일성이 있습니다.
1-Value Equality
struct와 값 )
2-Reference Equality
)(개체의경우)
동일성 검사를 구현하기 위한 두 가지 기본 표준 프로토콜이 있습니다.
더 1- 더==
그리고.!=
연산자
더 2- 더virtual
Equals
방법.
== 및 !=는 정적으로 해결됩니다. 즉, C#은 비교를 수행할 유형에 대해 컴파일 시간 결정을 내립니다.
를 들면 를들어예들.value-type
int x = 50;
int y = 50;
Console.WriteLine (x == y); // True
을 제외하고는reference type
object x = 50;
object y = 50;
Console.WriteLine (x == y); // False
그Equals()
피연산자 실제 유형에 따라 런타임에 원래 확인되었습니다.
예를 들어, 다음 예시에서, 런타임에, 다음과 같이 결정될 것입니다.Equals()
값에 는 int입니다.true
.
object x = 5;
object y = 5;
Console.WriteLine (x.Equals (y)); // True
그러나 참조 유형의 경우 참조 동일성 검사를 사용합니다.
MyObject x = new MyObject();
MyObject y = x;
Console.WriteLine (x.Equals (y)); // True
:Equals()
비사용에 사용합니다.struct
, struct의 각 Equals를 합니다.
여부Equals()
그리고.==
구현에 따라 동일합니다.C#은 사용자가 다음에 대해 다른 동작을 설정할 수 있도록 하기 때문입니다.Equals()
그리고.==
각각 다음과 같다.
class CompareTest
{
public readonly int val;
public CompareTest(int val)
{
this.val = val;
}
public override bool Equals(object obj)
{
return obj is CompareTest test && this.val == test.val;
}
public override int GetHashCode()
{
return val;
}
public static bool operator == (CompareTest a, object b)
{
return Equals(a, b);
}
public static bool operator != (CompareTest a, object b)
{
return !(a == b);
}
}
예에서, 저는 이예서에, 만습니다었들저는을 .Equals()
그리고.==
같은 행동을 합니다.하지만 만약 제가 그들을 다르게 만든다면요?예:
public static bool operator == (CompareTest a, object b)
{
return false;
}
Equals()
하지만 정적으작지만동하로.==
절대 안 될 겁니다
행동을 한 : 어떤 것이 냐, 냐, 냐, 냐, 냐.==
왼쪽 값에 따라 함수가 호출됩니다.
Compare Test a = new CompareTest(1);
object b = new CompareTest(1);
CompareTest c = new CompareTest(1);
Debug.Log("AB " + (a == b)); // true
Debug.Log("BA " + (b == a)); // false! because it calls object's == function
Debug.Log("AC " + (a == c)); // true
Debug.Log("CA " + (c == a)); // true
개체를 만들 때 개체에는 두 부분이 있습니다. 하나는 내용이고 다른 하나는 해당 내용에 대한 참조입니다. ==
참조를 비교합니다.equals()
합니다.
http://www.codeproject.com/Articles/584128/What-is-the-difference-between-equalsequals-and-Eq
==
== 연산자는 모든 종류의 두 변수를 비교하는 데 사용할 수 있으며 비트만 비교합니다.
int a = 3;
byte b = 3;
if (a == b) { // true }
참고: int의 왼쪽에는 0이 더 있지만 여기서는 그것에 대해 신경 쓰지 않습니다.
inta (00000011) == 바이트 b (00000011)
== 연산자는 변수의 비트 패턴에만 관심이 있습니다.
두 참조(원본)가 힙에서 동일한 개체를 참조하는 경우 ==를 사용합니다.
규칙은 변수가 참조인지 원시인지에 관계없이 동일합니다.
Foo a = new Foo();
Foo b = new Foo();
Foo c = a;
if (a == b) { // false }
if (a == c) { // true }
if (b == c) { // false }
a == c는 참 a == b는 거짓입니다.
비트 패턴은 a와 c에 대해 동일하므로 ==를 사용하면 동일합니다.
같음():
equals() 메서드를 사용하여 서로 다른 두 개체가 동일한지 확인합니다.
예를 들어 "Jane"의 문자를 나타내는 두 개의 서로 다른 String 객체
Equal과 ==의 유일한 차이점은 객체 유형 비교에 있습니다.참조 유형 및 값 유형과 같은 다른 경우에는 거의 동일합니다(둘 다 비트 단위 동일하거나 둘 다 참조 동일).
객체: 등호: 비트 단위 등호 ==: 참조 등호
string: (문자열과 ==은 문자열에 대해 동일하지만 문자열 중 하나가 개체로 변경되면 비교 결과가 달라질 수 있음) 동일: 비트 단위 동등 == : 비트 단위
자세한 내용은 여기를 참조하십시오.
언급URL : https://stackoverflow.com/questions/814878/c-sharp-difference-between-and-equals
'it-source' 카테고리의 다른 글
Xcode는 각 키 입력 후에도 스토리보드를 계속 빌드합니다. (0) | 2023.05.26 |
---|---|
"객체 참조가 객체의 인스턴스로 설정되지 않음"은 무엇을 의미합니까? (0) | 2023.05.26 |
명명된 튜플과 명명된 튜플의 차이점은 무엇입니까?튜플? (0) | 2023.05.26 |
"빌드 앤 런" 없이 아이폰 시뮬레이터를 시작할 수 있습니까? (0) | 2023.05.26 |
버튼 또는 레이블 텍스트에서 "&"(앰퍼샌드)를 표시하려면 어떻게 해야 합니까? (0) | 2023.05.26 |