gpt4 book ai didi

c# - 以高性能方式审核和验证对 C# 类和结构属性的更改

转载 作者:太空狗 更新时间:2023-10-29 20:37:25 25 4
gpt4 key购买 nike

我有几个 c# 结构,它们为非常大的数据文件中的结构赋予形状。这些结构解释文件数据字中的位,并将它们转换为一流的属性。这是一个示例:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TimeF1_MsgDayFmt
{
// Time Data Words
public UInt16 TDW1;
public UInt16 TDW2;
public UInt16 TDW3;

/// <summary>
/// Tens of milliseconds
/// </summary>
public UInt16 Tmn
{
// Bits.Get is just a helper method in a static class
get { return Bits.Get(TDW1, 0, 4); }
set
{
if (value > 9)
throw new ArgumentOutOfRangeException();

TDW1 = Bits.Set(TDW1, value, 0, 4);
}
}

/// Several other properties follow.

我需要做两件事,我认为它们是相关的。第一个是能够使用一组验证规则来验证整个类。我知道有几种方法可以做到这一点;最吸引我的是用这样的东西来注释每个属性:

[ValidateRange(0,9)]
public UInt16 Tmn
{
get { return Bits.Get(TDW1, 0, 4); }
set
{
/// etc. Will probably no longer throw the ArgumentOutOfRangeException here.

... 然后使用 Validator 类读取所有属性属性,根据注释规则检查每个属性值,并返回错误对象的集合。但是我担心反射要花多长时间;这些结构必须具有极高的性能。

public List<Error> Validate(TimeF1_MsgDayFmt original)

我需要做的第二件事是对属性更改进行审计;也就是说,对于每个已从其原始值更改的属性,我需要能够得到一个字符串,上面写着“Property foo changed from bar to baz.” 为此,我想一种比较“之前”和“之后”struct 的所有属性并注意差异的方法。

public List<string> Compare(TimeF1_MsgDayFmt original, TimeF1_MsgDayFmt new)

在这两种情况下,代码都将涉及遍历所有属性并以尽可能快的方式单独检查每个属性。

我该如何处理?

最佳答案

如果问题是,读入结构的数据是否匹配额外的约束,您首先必须弄清楚如何写下这些约束。 (在您的示例中,您编写了 [ValidateRange(0,9)] 作为此类约束之一)。

一旦您有了写下约束的方法,那么您大概必须将数据读入相应的结构,然后然后检查约束。 (在您的示例中,您提出了使用反射的想法)。

在我看来,写下此类约束且执行速度最快的最简单方法就是将它们简单地编写为额外的 C# 代码。对于您可以想象的每个约束,您可以添加一个类的方法来检查约束并返回一个 bool 值。您可以添加一个标准约束“CheckIt”来计算所有单独约束方法的联合。

写约束应该很容易。我希望 C# 编译器内联其他方法,尤其是当它们很小且不带参数(隐含类除外)时。这应该能让它们变快。

如果 C# 编译器不执行此操作,请切换到 C++,在那里您几乎可以强制内联。

关于c# - 以高性能方式审核和验证对 C# 类和结构属性的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com