如何验证方法外部的条件

How to verify condition outside of a method

提问人:Bob.at.Indigo.Health 提问时间:1/7/2020 最后编辑:Bob.at.Indigo.Health 更新时间:1/10/2020 访问量:208

问:

有没有办法在代码中创建类变量时验证其完整性?

例如,我创建并初始化一个类成员变量,如下所示:

public class MyClass
{
  public static Dictionary<MyEnum, int> SomeDictionary = new Dictionary<MyEnum, int> {
            { MyEnum.First, 9 },
            { MyEnum.Second, 7 },
            { MyEnum.Third, 17 }
  };

  // This obviously doesn't compile
  Debug.Assert(<SomeDictionary contains good stuff>);

  // Some method in my class
  public void SomeMethod()
  {
    // I could use something like this in this method to verify
    // the integrity of SomeDictionary, but I'd rather do this
    // at the point (above) where SomeDictionary is defined.
    Contract.Requires(<SomeDictionary contains expected stuff>);
  }
}

正如我在代码中指出的那样,我想在“类”范围内验证我的数据内容,但只能在方法(或属性)范围内工作。Debug.AssertContract.Requires

编辑: 这个问题最初使用一个列表,其内容与枚举(切向)相关,但人们关注的是该列表是如何从枚举派生的,而不是如何验证列表内容的问题。因此,我完全重写了这个问题,以澄清这个问题是关于验证的,而不是关于构建数据结构的。

C# 代码协定

评论

1赞 Fabio 1/7/2020
为什么不根据枚举值生成列表,而不是验证硬编码值?
0赞 Bob.at.Indigo.Health 1/7/2020
这只是一个例子。在实际应用中,相关性并不那么简单。(实际上,我的实际应用程序是一个字典,而不是一个列表,我需要验证我是否为枚举的每个成员都有一个字典条目。
1赞 Fabio 1/7/2020
我的建议是编写字典包含所有枚举值键的测试,我希望您:)编写自动测试。通过测试,可以使生产代码中缺少语言缺失功能的“变通方法”保持干净。
0赞 Bob.at.Indigo.Health 1/8/2020
@Fabio 编写单元测试来验证 List(或 Dictionary 或其他内容)的内容并不是对 OP 的真正答案(它询问如何在代码中声明数据的位置进行测试),但我喜欢它!缺乏更好的答案,如果你把你的“建议”作为答案,我会接受它

答:

0赞 fanuc_bob 1/7/2020 #1

如果你的类型是你所声明的,它是在项目中的其他位置定义的,你可以从枚举创建列表。

using System.Linq;

enum Stuff
{
  UglyStuff,
  BrokenStuff,
  HappyStuff
}

public class MyStuff
{
  public static List<string> MyList => System.Enum.GetNames(typeof(Stuff)).ToList();
}
0赞 x00 1/9/2020 #2

这就足够了吗?https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

静态构造函数也是一个方便的地方,可以对类型参数强制执行运行时检查,而类型参数在编译时无法通过约束(类型参数约束)进行检查。

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

但是单元测试可以更好。如果不是因为它们与代码相去甚远,必须单独编写和维护。但至少它们没有运行时开销。

评论

0赞 x00 1/9/2020
@Gauravsa我认为更新,或者更好地称其为完全重写会使我的第一个答案下的评论变得无关紧要。我错了吗?
1赞 Gauravsa 1/9/2020
好吧,评论可以由相应的用户删除。很多时候,人们会删除不再相关的评论