C#은 두 개체 유형을 서로 비교하지 못하지만 VB는 비교하지 못하는 이유는 무엇입니까?
나는 C#에 두 개의 객체가 있는데 그것이 Boolean인지 다른 유형인지 모릅니다.하지만 제가 그 C#을 비교하려고 하면 정답을 제시하지 못합니다.저는 VB.NET과 같은 코드를 시도해 보았는데, 그것으로 끝입니다!
해결책이 있다면 제게 이것을 어떻게 고칠 수 있는지 알려주실 수 있나요?
C#:
object a = true;
object b = true;
object c = false;
if (a == b) c = true;
MessageBox.Show(c.ToString()); //Outputs False !!
VB.NET:
Dim a As Object = True
Dim b As Object = True
Dim c As Object = False
If (a = b) Then c = True
MessageBox.Show(c.ToString()) '// Outputs True
에서, C# 서에는==
연산자(참조 유형 식에 적용되는 경우)는 오버로드되지 않는 한 참조 동일성 검사를 수행합니다.당신은 복싱 전환의 결과인 두 개의 참조를 비교하고 있습니다. 그래서 그것들은 별개의 참조입니다.
EDIT:합니다.==
다른 동작을 얻을 수 있지만, 그것은 표현식의 컴파일 시간 유형을 기반으로 합니다.예를들면,string
에는 을(를) 제공합니다.==(string, string
):
string x = new string("foo".ToCharArray());
string y = new string("foo".ToCharArray());
Console.WriteLine(x == y); // True
Console.WriteLine((object) x == (object) y); // False
여기서 첫 번째 비교는 오버로드된 연산자를 사용하고 두 번째 비교는 "기본" 참조 비교를 사용합니다.
VB는=
운영자는 훨씬 더 많은 일을 합니다 - 그것은 심지어 사용하는 것과 동등하지도 않습니다.object.Equals(x, y)
텍스트를 비교하는 방법에 영향을 미칠 수 있기 때문입니다.
기본적으로 운영자는 동일한 방식으로 작동하지 않으며 동일한 방식으로 작동하지 않습니다.
C# 측면을 설명하는 Jon의 답변 외에도 VB가 수행하는 작업은 다음과 같습니다.
를 사용한 에서 »Option Strict On
에 의한 =
항상 동일한 값을 검정하고 동일한 기준을 검정하지 않습니다.사실, 당신의 코드는 당신이 한번 전환하면 컴파일되지도 않습니다.Option Strict On
System.Object
Operator=
당신은 항상 이 옵션을 사용해야 합니다. 이 옵션은 비너스 파리지옥보다 더 효과적으로 벌레를 잡습니다(비록 당신의 특정한 경우에는 이 느슨한 행동이 실제로 옳은 1일을 하지만).
실은과 .Option Strict On
는 C에서 VB는 C#보다 엄격하게 동작합니다. C#에서a == b
에 대한 호출을 트리거합니다.SomeType.operator==(a, b)
또는 이 값이 존재하지 않으면 참조 동일성 비교를 호출합니다(호출과 동일).object.ReferenceEquals(a, b)
).
가 VB로 a = b
항상 등호 2연산자를 호출합니다.참조 동일성 비교를 사용하려면 다음을 사용해야 합니다.a Is b
번 (이은것한, 다번같와, 다니습시다▁(▁as,▁same▁()와 같습니다.Object.ReferenceEquals(a, b)
).
1) 다음은 사용하는 이유에 대한 좋은 설명입니다.Option Strict Off
좋지 않은 생각입니다.저는 그 전부터 거의 10년 동안 VB.NET을 사용해 왔습니다.몇 년 전까지만 해도 NET의 공식 출시였는데, 저는 전혀 알지 못합니다.a = b
으로 처리합니다.Option Strict Off
그것은 일종의 평등 비교를 하지만, 정확히 무슨 일이 일어나고 왜 일어나는지는 전혀 모릅니다.C#보다 더 복잡합니다.dynamic
기능(충분히 문서화된 API에 의존하기 때문).MSDN은 다음과 같이 말합니다.
왜냐면
Option Strict On
강력한 타이핑 기능을 제공하고, 데이터 손실로 인한 의도하지 않은 유형 변환을 방지하며, 지연 바인딩을 허용하지 않으며, 성능을 향상시키므로 이 기능을 사용하는 것이 좋습니다.
2) 존은 한 가지 예외인 문자열을 언급했는데, 여기서 동등성 비교는 하위 호환성의 이유로 더 많은 것을 합니다.
개체 인스턴스는 "==" 연산자와 비교되지 않습니다.방법 "equals"를 사용해야 합니다."==" 연산자는 객체가 아닌 참조를 비교합니다.
사용해 보십시오.
public class MyObject
{
public MyObject(String v)
{
Value = v;
}
public String Value { get; set; }
}
MyObject a = new MyObject("a");
MyObject b = new MyObject("a");
if(a==b){
Debug.WriteLine("a reference is equal to b reference");
}else{
Debug.WriteLine("a reference is not equal to b reference");
}
if (a.Equals(b)) {
Debug.WriteLine("a object is equal to b object");
} else {
Debug.WriteLine("a object is not equal to b object");
}
결과:
a reference is not equal to b reference
a object is not equal to b object
이제 시도해 보십시오.
public class MyObject
{
public MyObject(String v)
{
Value = v;
}
public String Value { get; set; }
public bool Equals(MyObject o)
{
return (Value.CompareTo(o.Value)==0);
}
}
MyObject a = new MyObject("a");
MyObject b = new MyObject("a");
if(a==b){
Debug.WriteLine("a reference is equal to b reference");
}else{
Debug.WriteLine("a reference is not equal to b reference");
}
if (a.Equals(b)) {
Debug.WriteLine("a object is equal to b object");
} else {
Debug.WriteLine("a object is not equal to b object");
}
결과:
a reference is not equal to b reference
a object is equal to b object
문제는 C#의 == 연산자가 두 매개 변수의 컴파일 시간 유형을 기반으로 하는 정적 메서드에 대한 호출(기술적으로는 아닐 수 있지만 그렇게 생각할 수도 있음)이라는 것입니다.이러한 개체의 실제 런타임 유형은 중요하지 않습니다.
컴파일러는 해당 컴파일 시간 유형을 기반으로 어떤 구현이operator ==
사용할 수 있습니다.기본값을 사용할 수 있습니다.object
구현은 언어에서 제공하는 숫자 오버로드 중 하나를 사용하거나 사용자 정의 구현일 수 있습니다.
이는 VB가 컴파일 시 구현을 결정하지 않는다는 점에서 VB와 다릅니다. 두 개의 를 검사하여 시 간 까 변 검 여 어 하 구 떤 현 이 사 를 수 매 개 개 의 지 두 대 지 기 정 하 된 고 ▁it 이 ▁param 구 eters ation ▁that ▁which ▁and s ▁waits ▁of ▁inspect ▁to ▁implement ▁runtime ▁two ▁until 실 ▁determine 현 ▁given 시 행==
사용해야 하는 연산자.
값이 , 이 은 코에부값포있어지함유있다변 형식의 에 있습니다.object
변수가 유형이기 때문입니다.object
C# 컴파일러는 다음을 사용합니다.object
의 ==
개체 인스턴스가 아닌 참조를 비교합니다.부울 값은 상자이므로 값이 동일하더라도 참조가 동일하지 않습니다.
VB 코드는 변수가 어떤 유형이든 상관하지 않습니다.실행 시간까지 기다린 다음 두 변수를 확인하고 실제로 두 변수가 모두 부울 유형임을 확인하여 부울을 사용합니다.==
구현은 을 비교합니다(연산자를 를 열 ).이 구현은 참조가 아닌 부울의 값을 비교합니다(그리고 부울은 해당 연산자를 호출하기 전에 상자를 열 것이므로 참조 비교는 더 이상 의미가 없습니다).부울의 값이 같기 때문에 true를 반환합니다.
언급URL : https://stackoverflow.com/questions/14837209/why-c-sharp-fails-to-compare-two-object-types-with-each-other-but-vb-doesnt
'source' 카테고리의 다른 글
jQuery.ajax()에서 "async: false"는 무엇을 합니까? (0) | 2023.05.17 |
---|---|
VBA가 Excel 인스턴스 간에 연결할 수 있습니까? (0) | 2023.05.17 |
은색 빛에서 자식 요소의 너비를 부모 요소의 너비에 바인딩하는 방법 (0) | 2023.05.17 |
Angular 2: 'input'의 알려진 속성이 아니므로 'ngModel'에 바인딩할 수 없습니다. (0) | 2023.05.17 |
자바스크립트와 CSS를 사용하여 스크롤할 때 테이블의 첫 번째 행과 첫 번째 열을 잠그려면 어떻게 해야 합니까? (0) | 2023.05.17 |