gpt4 book ai didi

c# - 为什么 C# 中的诚实函数示例仍然不诚实?

转载 作者:行者123 更新时间:2023-12-03 20:08:14 25 4
gpt4 key购买 nike

从这个引用:http://functionalprogrammingcsharp.com/honest-functions

在 C# 中定义方法/函数时,我学会了更加诚实。
它说更喜欢纯函数,以便函数始终给出签名中给出的确切返回类型。

但是,当我尝试应用它时:

int Divide(int x, int y)
{
return x / y;
}

从网站:

The signature states that the function accepts two integers and returns another integer. But this is not the case in all scenarios. What happens if we invoke the function like Divide(1, 0)? The function implementation doesn't abide by its signature, throwing DivideByZero exception. That means this function is also "dishonest". How can we make this function an honest one? We can change the type of the y parameter (NonZeroInteger is a custom type which can contain any integer except zero):


int Divide(int x, NonZeroInteger y)
{
return x / y.Value;
}

我不确定 NonZeroInteger 的实现是什么,他们似乎没有在网站上提供 NonZeroInteger 的任何实现,是否应该检查该类中的 0?和
我很确定如果我调用 Divide(1, null) 它仍然会显示错误,从而使函数不诚实。

为什么 C# 中的诚实函数示例仍然不诚实?

最佳答案

以您发布的示例并阅读链接为例,如果您想让函数“诚实”,那么您实际上不需要创建新类型,您只需实现 Try图案:

bool TryDivide(int x, int y, out int result)
{
if(y != 0)
{
result = x / y;
return true;
}

result = 0;
return false;
}

这个功能基本实现了“诚实”的原则。名称表示它将尝试进行除法,结果“bool”表示它将表明它已成功。

您可以创建一个 struct NonZeroInteger但是您将不得不围绕它编写大量代码以使其像常规数字类型一样工作,并且您可能会绕一圈。例如,如果您通过 0 会怎样?到 NonZeroInteger构造函数?它应该失败吗?是不是很诚实。

另外, struct type 总是有一个默认构造函数,所以如果你要包装一个 int避免将其设置为 0 会很尴尬。

关于c# - 为什么 C# 中的诚实函数示例仍然不诚实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61015267/

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