문제

나는 항상 dbnull.value가 싱글 톤이라고 가정했습니다. 따라서 다음과 같은 일을 할 수 있습니다.

vb.net :

If someObject Is DbNull.Value Then
    ...
End if

씨#:

If (someObject == DbNull.Value)
{
    ...
}

그러나 최근에 XMLSerialiser를 사용하여 DBNULL 인스턴스를 연속화했으며 갑자기 더 이상 싱글 톤이 아니 었습니다. 유형 비교 작업 (예 : C#의 (OBJ IS DBNULL))는 작동합니다.

코드는 다음과 같습니다.

[Serializable, System.Xml.Serialization.XmlInclude(typeof(DBNull))]
public class SerialiseMe
{
    public SerialiseMe() { }

    public SerialiseMe(object value)
    {
        this.ICanBeDbNull = value;
    }
    public Object ICanBeDbNull { get; set; }
}

public void Foo()
{
    var serialiseDbNull = new SerialiseMe(DBNull.Value);
    var serialiser = new System.Xml.Serialization.XmlSerializer(typeof(SerialiseMe));
    var ms = new System.IO.MemoryStream();
    serialiser.Serialize(ms, serialiseDbNull);
    ms.Seek(0, System.IO.SeekOrigin.Begin);
    var deSerialisedDbNull = (SerialiseMe)serialiser.Deserialize(ms);

    // Is false, WTF!
    var equalsDbNullDeserialised = deSerialisedDbNull.ICanBeDbNull == DBNull.Value;
    // Is false, WTF!
    var refEqualsDbNullDeserialised = object.ReferenceEquals(deSerialisedDbNull.ICanBeDbNull, DBNull.Value);
    // Is true.
    var convertIsDbNullDeserialised = Convert.IsDBNull(deSerialisedDbNull.ICanBeDbNull);
    // Is true.
    var isIsDbNullDeserialised = deSerialisedDbNull.ICanBeDbNull is DBNull;

}

왜 이런 경우입니까? 그리고 어떻게됩니까? 그리고 다른 정적 필드에서 일어날 수 있습니까?

추신 : VB 코드 샘플이 참조 비교를 수행하고 있으며 C#은 Object.equals를 호출하고 있습니다. 둘 다 dbnull과 동일한 동작을 가지고 있습니다. 나는 보통 VB와 함께 일합니다.

도움이 되었습니까?

해결책

하지만 DBNull.Value a static readonly 그리고 단일 인스턴스로만 존재합니다 ... SERIALIZE를 해제 할 때 직렬화 코드는 클래스의 새로운 인스턴스를 생성합니다. DBNull 스트림의 '데이터'에서. 이후 DBNull.Value 단순히 a입니다 DBNull 예를 들어, 직렬화가 '특별한'인스턴스임을 알 수있는 방법은 없습니다.

노트:
같은 이유로, 당신이 당신이 일련의 '싱글 톤'인스턴스를 사용하여 자신의 수업을 일련의 수업으로 만들면, 당신은 정확히 동일한 동작을 얻게됩니다. 사형화 된 인스턴스는 원래 인스턴스와 구별 할 수 없지만 동일한 인스턴스.

다른 팁

C# 코드는 .equals 메소드를 호출하지 않습니다. 테스트를 거치면 실제로 당신이 대체했는지 확실히 확신합니다.

someObject == DbNull.Value

~와 함께

DbNull.Value.Equals(someObject) 

그것은 당신에게 예상 결과를 줄 것입니다. 평등 연산자의 일부 내부 및 Equals Method의 경우 다음을 살펴 봅니다.그 주제에 대한 Eric Lipperts 블로그 게시물

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top