c#类中值类型属性的属性有效指示

本文关键字:属性 指示 有效 类型 | 更新日期: 2023-09-27 18:01:49

我有一个数据流,每次只更新完整对象的一部分。所以10个属性中,只有1个是有效的。无论如何,我将创建我的类的一个新实例,但只有一个具有有效数据的属性。

我希望能够指示属性是否包含真实数据,并将属性保持为值类型(因此没有可空类型)。所有的值都是可能的(所以没有'INT_MAX'表示无效)。

以前我使用int32作为二进制掩码来指示有效的属性,但这显然对属性的数量有限制,并且在类层次结构中它变得混乱。我还在掩码上应用了get'ers,所以一个布尔值SomePropertyIsValid-property是可用的,这很有帮助,但它使可用的属性增加了一倍。

我又要使用位掩码了,除非有人有好主意?


添加:我读取了来自第三方的UDP数据包(每秒约100k)。它们的编码如下:

int32 id;     // Unique system id of the object being updated
int32 mask;   // indicates which fields that are included in the message
int32 fieldA; // If mask bit 0 is high
float fieldB; // If mask bit 1 is high
int32 fieldC; // If mask bit 2 is high
int32 fieldD; // If mask bit 3 is high
int32 fieldE; // If mask bit 4 is high

我已经创建了一个类来反序列化UDP消息。我创建一个新实例,或者如果以前收到过来自相同对象id的数据,则更新一个正在删除的实例。

我的类将所有字段公开为接口定义的属性:

public interface IMessage
{
  int Id {get; set;}
  int FieldA {get; set;}
  double FieldB {get; set;}
  int FieldC {get; set;}
  int FieldD {get; set;}
  int FieldE {get; set;}
}

现在我如何指示哪些属性是实际更新的?Pair和nullable类型将使所使用的内存加倍(或更多),因此使用位掩码(就像第三方数据源使用的那样)似乎不是一个坏主意,但我只是想检查是否有其他一些不会对性能产生大影响的漂亮技巧。

c#类中值类型属性的属性有效指示

如何将子类化为10个不同的类,每个类包含一个属性?

根据你的需要(实际上是一次一个属性),我认为这个更合适。然后你可以尝试'as'操作符来检查你有哪个子类,并使用它的属性…

为每个属性使用getter和setter,那么当您从该属性中获得值而没有正确初始化时,您可以抛出异常,然后处理此异常。

另一个选项,如果你不想使用异常,不想属性的数量翻倍,你的属性可以返回KeyValuePair或Tuple

可空,位掩码,布尔值IsXXValid属性,等等。你有选择

BUT你在做正确的事情吗?这听起来像是一个糟糕的设计决策。我对这个项目了解得不够,帮不上忙。

如果通常只设置了一个(或几个)这些属性,为什么不使用Dictionary呢?如果该属性不存在,则不设置。

您还可以从动态对象中获得乐趣。这两个选项都不像您正在讨论的那样是静态类型的,但可以更好地解决问题。

哦,关于Nullable:如果一个属性是空的,你可以像object.Property.Value一样使用它,如果它是空的,它会抛出一个异常。听起来很容易。