我有一个数据流,每次只更新一个完整对象的部分内容。因此,在10个属性中,只有1个实际上可以有效。我会继续创建我的类的新实例,但只有一个属性具有有效数据。
我希望能够指出属性是否包含实际数据,并保持属性为值类型(因此没有可空类型)。并且所有值都是可能的(因此没有'INT_MAX'表示无效)。
以前我使用int32作为二进制掩码来指示有效属性,但这显然对属性的数量有限制,并且在类层次结构中它变得混乱。 我还在掩码上应用了get'ers,因此可以使用布尔SomePropertyIsValid属性,这有所帮助,但它使可用的属性加倍。
我会再次使用位掩码,除非有人有个好主意吗?
增加: 我读了一个来自第三方的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;}
}
现在我该如何指出实际更新的属性? 对和可空类型将使用双倍(或更多)内存,因此使用位掩码(如第三方数据源使用)似乎不是一个坏主意,但我只是想检查是否还有其他漂亮的没有大的性能影响的技巧。
答案 0 :(得分:0)
如何将子类分类到10个不同的类,每个类包含一个属性?
根据您的需要(实际上一次只有一个属性),我认为这更合适。然后你可以尝试'as'运算符来检查你拥有哪个子类并使用它的属性......
答案 1 :(得分:0)
对每个属性使用getter和setter,然后在通过正确初始化从此属性获取值时抛出异常,然后处理此异常。
另一种选择,如果您不想使用例外并且不想将属性数量翻倍,您的属性可能会返回KeyValuePair或Tuple
答案 2 :(得分:0)
Nullable,bitmasks,布尔IsXXValid属性,等等。你有选择。
但是你是否正确地做事?这听起来像是一个糟糕的设计决定。我对该项目的帮助不够了解。
如果通常只设置这些属性中的一个(或几个),为什么不使用Dictionary。如果该属性不存在,则表示未设置。
你也可以玩动态物品。这两个选项都不像您正在讨论的那样是静态类型的,但可以更好地解决问题。
哦,关于Nullable:
如果属性为Nullable,则可以像object.Property.Value
一样使用它,如果它为null,它将抛出异常。听起来很容易。