Tôi đã luôn luôn giả định rằng DbNull.value là một singleton. Và như vậy, bạn có thể làm những việc như thế này:Tại sao DbNull của tôi không phải là một singleton khi tôi deserialise nó bằng cách sử dụng XmlSerialiser?
VB.NET:
If someObject Is DbNull.Value Then
...
End if
C#:
If (someObject == DbNull.Value)
{
...
}
Nhưng gần đây, tôi đăng một trường hợp sử dụng DBNull XmlSerialiser và đột nhiên nó không phải là một singleton nữa. Loại hoạt động so sánh (như C# 's (obj là DBNull)) làm việc OK mặc dù.
Mã sau:
[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;
}
Tại sao đây là trường hợp? Và nó xảy ra như thế nào? Và nó có thể xảy ra với bất kỳ trường tĩnh nào khác không?
PS: Tôi biết mẫu mã VB đang thực hiện so sánh tham chiếu và C# đang gọi Object.Equals. Cả hai đều có cùng một hành vi với DBNull. Tôi thường làm việc với VB.
Tôi đã làm rối tung một vài thứ tương tự trong vài giờ ngay bây giờ ... Tôi thậm chí còn không thử IS DBNull. – Feign