gpt4 book ai didi

c# - 说服 C# 编译器执行将在成员返回后停止

转载 作者:太空狗 更新时间:2023-10-30 01:11:27 26 4
gpt4 key购买 nike

我不认为这在目前是可能的,或者它是否是一个好主意,但这是我刚才正在考虑的事情。我使用 MSTest 对我的 C# 项目进行单元测试。在我的一项测试中,我执行以下操作:

MyClass instance;

try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}

instance.doStuff(); // Use of unassigned local variable 'instance'

为了编译这段代码,我必须在其声明或 catch block 中为 instance 赋值。我也可以在 Assert.Fail 之后return,但这仍然是一种解决方法,而不是编译器只是知道在这一点之后无法继续执行。据我所知,Assert.Fail 永远不会允许执行通过它,因此 instance 永远不会在没有值的情况下使用。那为什么我必须给它赋值呢?如果我将 Assert.Fail 更改为类似 throw ex 的代码,我假设代码编译正常,因为它知道异常将不允许执行继续到 instance 将在未初始化的情况下使用。

相反,如果我不希望测试失败,而是被标记为不确定怎么办?我可以执行 Assert.Inconclusive 而不是 Fail,如果编译器知道在那之后不会继续执行,那就太好了。

那么关于允许执行的位置是运行时知识还是编译时知识的情况?对于 C# 而言,有某种方式表明成员(在本例中为 Assert.Fail)在返回后将永远不允许执行是否合理?也许可以采用方法属性的形式。这对编译器来说是有用的还是不必要的复杂性?

外部单元测试

既然人们[有效地]指出这是一种编写单元测试的愚蠢方法,请在单元测试领域之外考虑我的问题:

MyClass instance;

if (badThings)
{
someMethodThatWillNeverReturn();
}
else
{
instance = new MyClass();
}

instance.doStuff();

在这里,我可能会用抛出异常替换对 someMethodThatWillNeverReturn 的调用,也许如果我有事情要做,我可以在异常的构造函数中完成。

Resharper 知道

如果我在 Assert.FailAssert.Inconclusive 之后添加一个 return,Resharper 颜色 return 灰色和有一个工具提示说“代码是启发式无法访问的。”

最佳答案

是的,有一些表明成员永远不会正常完成的东西是合理的 - 即断言成员之后的点不可到达。 (这可能是由于异常或由于永远循环。)

如果你错了,你会希望有一些东西(无论是在 CLR 还是编译器中)来制定备份计划:如果有人改变了会发生什么 Assert.Fail 正常返回?您可能希望部分代码验证是检查它永远不会正常返回的内容。

我相信 Microsoft 的某个人有一篇关于这个想法的博客文章...我会看看是否能找到它。

就表示它的语法而言,虽然属性是一个显而易见的想法,但我非常喜欢返回类型“从不”的想法。显然,这可能会与现有的“从不”类型发生冲突,但是嘿...

就其实用性而言:显而易见的解决方法是在语句之​​后立即抛出异常,但必须这样做确实很烦人。 (它通常比返回更好,因为它意味着如果你在其中编写的方法具有返回类型,则你不必指定无意义的返回值 - 而且你也不需要确保所有 out 参数已分配值。)所以它不是必需的 - 但我认为这会很好。这是否是 C# 团队可以用他们有限的预算做的最重要的事情是另一回事 - 只是为了抢先 Eric ;)

关于c# - 说服 C# 编译器执行将在成员返回后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511109/

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