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

时间:2014-05-06 11:33:09

标签: c# validation

我有一个数据流,每次只更新一个完整对象的部分内容。因此,在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;}
}

现在我该如何指出实际更新的属性? 对和可空类型将使用双倍(或更多)内存,因此使用位掩码(如第三方数据源使用)似乎不是一个坏主意,但我只是想检查是否还有其他漂亮的没有大的性能影响的技巧。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

对每个属性使用getter和setter,然后在通过正确初始化从此属性获取值时抛出异常,然后处理此异常。

另一种选择,如果您不想使用例外并且不想将属性数量翻倍,您的属性可能会返回KeyValuePair或Tuple

答案 2 :(得分:0)

Nullable,bitmasks,布尔IsXXValid属性,等等。你有选择。

但是你是否正确地做事?这听起来像是一个糟糕的设计决定。我对该项目的帮助不够了解。

如果通常只设置这些属性中的一个(或几个),为什么不使用Dictionary。如果该属性不存在,则表示未设置。

你也可以玩动态物品。这两个选项都不像您正在讨论的那样是静态类型的,但可以更好地解决问题。

哦,关于Nullable: 如果属性为Nullable,则可以像object.Property.Value一样使用它,如果它为null,它将抛出异常。听起来很容易。