对不起该帖的标题,不知道如何表达更好..
我有一个对象unit
,我使用MemoryStream
和BinaryFormatter
将其保存到文件系统。
现在我必须运行NUNIT测试,检查对象car
和carloadedFromDisk
是否相等。此测试失败,因为它看起来在堆上有不同的引用。
是否可以让反序列化的对象carloadedFromDisk
指向对象车的现有引用?
我该怎么做才能使测试通过?
示例:
var car = new Car("Audi");
var unit = new Unit("GoldSmith", car);
unit.save();
var carloadedFromDisk = Car.get(carId); // deserialized
Assert.AreEqual(unit.Car, carloadedFromDisk); // <-- fails
答案 0 :(得分:1)
是否可以将反序列化的对象carloadedFromDisk添加到 指向对象车的现有参考?
这是不可能的。在反序列化期间创建新实例。即使您可以通过反序列化器传递现有实例,但最终会使用单个car
实例与自身相比(总是为真)。
现在我必须运行一个NUNIT测试,检查两个对象是否同时运行 carloadedFromDisk是平等的。此测试失败,因为它看起来像 他们在堆上有不同的引用。
您应该比较值,而不是比较引用。在Equals
类中实施GetHashCode
和Car
方法,以便Car
个实例的字段用于比较和哈希生成。 Equals
将通过Assert.AreEqual
断言调用Car
。例如。如果您的public int Id { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
Car other = (Car)obj;
return (Id == other.Id) && (Name == other.Name);
}
public override int GetHashCode()
{
unchecked
{
int hash = 19;
hash = hash * 23 + Id;
hash = hash * 23 + Name == null ? 0 : Name.GetHashCode();
return hash;
}
}
有两个属性:
function is_box_black_corner(x,y,width,heigth){
var counter=0;
for (var i=x; i<(x+width); i++){
for (var j=y; j<(y+heigth); j++){
if(my_isblack(i,j)==1){
counter++;
}
}
}