gpt4 book ai didi

c# - 检查是否处理了所有枚举值

转载 作者:太空狗 更新时间:2023-10-30 01:06:46 25 4
gpt4 key购买 nike

假设有一段代码:

enum Directions
{
North,
South,
East,
West
}

// (...)

switch (dir)
{
case North : // Do sth
case South : // Do sth
case East : // Do sth
case West : // Do sth
}

请特别注意缺少 default: 指令。现在假设,后来有人向该枚举添加了四个值:NorthEastNorthWestSouthEastSouthWest。在这种情况下,引用的代码很可能会影响未定义的行为,因为没有安全措施来处理对 Directions 枚举类型的可能扩展。

我有一些关于这件事的问题。

  1. 程序员是否应该在这里实现安全措施,例如:

    default: throw new InvalidArgumentException("Unsupported enum value!");
  2. 这个事情要不要单元测试?

    // Naïve implementation, for example purposes only
    [ExpectedException(typeof(InvalidArgumentException))]
    [Test]
    void SomeTestMethod()
    {
    SomeFunction((Direction)-1);
    }

    如果是这样,您将如何自动执行此类测试(例如,找到不同于此枚举中所有其他值的序数值,考虑枚举支持类型等)?

  3. 是否应该在静态代码分析中验证这个问题?哪个工具可以提供这样的信息?我在 VS 2012 Pro 中编写了简单的概念验证,运行代码分析,但 IDE 报告“未检测到代码分析问题”。

    代码:

    namespace ManagedConsoleSketchbook
    {
    class Program
    {
    enum MyEnum
    {
    One,
    Two,
    Three
    }

    static void Main(string[] args)
    {
    MyEnum e = MyEnum.One;

    switch (e)
    {
    case MyEnum.One:
    break;
    case MyEnum.Two:
    break;
    }
    }
    }
    }
  4. 是否有解决这个普遍问题的通用方法?例如。也许我可以使用反射在 C# 中编写复杂的测试方法,但在 C++ 中,与在 C# 或其他高级语言中相比,确定这种潜在代码完整性漏洞要困难得多。

    <

为什么我要问是否应该在单元测试期间检查它?这是因为 - 据我所知 - 单元测试应验证,方法是否按照预期(记录)的方式运行。在这种情况下,它应该接受四个枚举元素中的任何一个,并且它确实接受了,所以所有测试都应该通过。检查潜在问题对我来说似乎不是单元测试过程的关注点。如果我想验证单元测试中潜在问题的所有可能性,我可能最终会为 3 行代码方法编写数百个测试。

另一方面,当有人决定向枚举添加另一个值时,它似乎是一种非常便宜(就消耗的资源而言)的方法,可以确保该方法不会导致任何严重问题。

最佳答案

1:是的,我经常这样做。

2:是的。我会添加这个:

[ExpectedException(typeof(InvalidArgumentException))]
[Test]
void SomeTestMethod()
{
Direction testValue = (Direction)-1;
Assert.IsFalse(Enum.IsDefined(typeof(Direction), testValue));
SomeFunction((Direction)-1);
}

关于c# - 检查是否处理了所有枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14339625/

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