Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 判断对象是否已修改的最佳方法是什么?_C#_.net - Fatal编程技术网

C# 判断对象是否已修改的最佳方法是什么?

C# 判断对象是否已修改的最佳方法是什么?,c#,.net,C#,.net,我有一个对象作为序列化的base-64字符串映射到cookie。我只想在服务器端cookie中存储的对象发生更改时写入一个新cookie 我想做的是,当对象从cookie中提取/初始化时,获取一个哈希代码,并将原始哈希代码与将cookie头发送到客户端之前存在的哈希代码进行比较,以确保除非进行了更改,否则不必重新序列化/发送cookie 我打算重写.NET的对象.GetHashCode()方法,但我不确定这是否是检查对象是否被修改的最佳方法 是否有其他方法可以检查对象是否被修改,或者是否应该覆盖

我有一个对象作为序列化的base-64字符串映射到cookie。我只想在服务器端cookie中存储的对象发生更改时写入一个新cookie

我想做的是,当对象从cookie中提取/初始化时,获取一个哈希代码,并将原始哈希代码与将cookie头发送到客户端之前存在的哈希代码进行比较,以确保除非进行了更改,否则不必重新序列化/发送cookie

我打算重写.NET的
对象.GetHashCode()
方法,但我不确定这是否是检查对象是否被修改的最佳方法

是否有其他方法可以检查对象是否被修改,或者是否应该覆盖
GetHashCode()
方法

更新我决定接受@rmbarnes的答案,因为它有一个有趣的问题解决方案,而且因为我决定在他的帖子末尾使用他的建议,而不是检查修改。但是,我仍然有兴趣听到任何人可能对我的场景有任何其他解决方案。

GetHashCode()应该始终与Equals()同步,并且Equals()不一定保证检查对象中的所有字段(在某些情况下,您希望不是这样)

此外,GetHashCode()不能保证为所有可能的对象状态返回唯一的值。可以想象(虽然不太可能)两个对象状态会产生相同的哈希代码(毕竟,它只具有int值的可能状态;有关更多详细信息,请参阅)

如果可以确保Equals()检查所有适当的字段,那么可以克隆对象以记录其状态,然后使用Equals()检查新状态以查看其是否已更改

顺便说一句:你提到序列化给了我一个想法。您可以序列化对象,记录它,然后在检查对象更改时,重复该过程并比较序列化的值。这将允许您检查状态更改,而无需对对象进行任何代码更改。但是,这不是一个很好的解决方案,因为:

  • 可能效率很低
  • 它容易在对象中进行序列化更改;对象状态更改可能会出现误报

  • 我个人会说按照你的计划去做。。好的哈希代码是查看对象是否“按原样”的最佳方法。。这里有很多散列算法,你可以看看,看看散列函数上的那些显而易见的算法,然后从那里开始


    重写GetHashCode并开始!只需确保信息的所有元素都构成散列的一部分:)

    在对象构造函数的末尾,您可以将对象序列化为基本64字符串,就像cookie存储它一样,并将其存储在成员变量中

    当您想检查cookie是否需要重新创建时,请重新序列化对象,并将这个新的base 64字符串与存储在成员变量中的字符串进行比较。如果已更改,请使用新值重置cookie

    注意这个问题-不要在序列化本身中包含存储base 64序列化的成员变量。我假设您的语言使用类似sleep()函数的东西(PHP就是这样做的)来序列化自身,所以只需确保该函数中不包含该成员

    这将始终有效,因为您正在比较要保存在cookie中的确切值,并且不需要重写GetHashCode(),这听起来可能会产生恶劣的后果


    所有这些都表明,我可能会放弃测试并总是重置cookie,与进行更改检查相比,它的开销不会太大,而且更不可能出现bug。

    我觉得奇怪,为什么要在服务器端和客户端存储同一个对象,尤其是在每次访问时比较它们的时候

    我猜反序列化cookie并将其与服务器端对象进行比较在性能上等同于再次序列化对象

    但是,如果您想这样做,我会将序列化的服务器端对象与cookie的值进行比较,并相应地进行更新。最糟糕的情况是,你做的序列化是白费力气的。最好的情况是,您进行了字符串比较

    另一种方法是反序列化和比较对象,最坏的情况是反序列化、比较n个字段,然后序列化。最好的情况是反序列化和比较n个字段