source

C#은 두 개체 유형을 서로 비교하지 못하지만 VB는 비교하지 못하는 이유는 무엇입니까?

ittop 2023. 5. 17. 23:28
반응형

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 OnSystem.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변수가 유형이기 때문입니다.objectC# 컴파일러는 다음을 사용합니다.object==개체 인스턴스가 아닌 참조를 비교합니다.부울 값은 상자이므로 값이 동일하더라도 참조가 동일하지 않습니다.

VB 코드는 변수가 어떤 유형이든 상관하지 않습니다.실행 시간까지 기다린 다음 두 변수를 확인하고 실제로 두 변수가 모두 부울 유형임을 확인하여 부울을 사용합니다.== 구현을 비교합니다(연산자를 를 열 ).이 구현은 참조가 아닌 부울의 값을 비교합니다(그리고 부울은 해당 연산자를 호출하기 전에 상자를 열 것이므로 참조 비교는 더 이상 의미가 없습니다).부울의 값이 같기 때문에 true를 반환합니다.

언급URL : https://stackoverflow.com/questions/14837209/why-c-sharp-fails-to-compare-two-object-types-with-each-other-but-vb-doesnt

반응형