- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设有一段代码:
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:
指令。现在假设,后来有人向该枚举添加了四个值:NorthEast
、NorthWest
、SouthEast
、SouthWest
。在这种情况下,引用的代码很可能会影响未定义的行为,因为没有安全措施来处理对 Directions 枚举类型的可能扩展。
我有一些关于这件事的问题。
程序员是否应该在这里实现安全措施,例如:
default: throw new InvalidArgumentException("Unsupported enum value!");
这个事情要不要单元测试?
// Naïve implementation, for example purposes only
[ExpectedException(typeof(InvalidArgumentException))]
[Test]
void SomeTestMethod()
{
SomeFunction((Direction)-1);
}
如果是这样,您将如何自动执行此类测试(例如,找到不同于此枚举中所有其他值的序数值,考虑枚举支持类型等)?
是否应该在静态代码分析中验证这个问题?哪个工具可以提供这样的信息?我在 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;
}
}
}
}
是否有解决这个普遍问题的通用方法?例如。也许我可以使用反射在 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/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!