gpt4 book ai didi

c# - 什么是默认值,为什么不可覆盖?

转载 作者:可可西里 更新时间:2023-11-01 03:13:50 24 4
gpt4 key购买 nike

在执行代码审查时,我发现可以通过使用 Null 对象模式来减少潜在错误的代码。然后我开始思考:如果那个业务对象的默认值是空对象而不是空引用,那不是很有用吗?

由于 C# 提供了默认运算符,我尝试像这样重载它:

public static MyObject operator default (MyObject object) 
{
return MyObject.Null;
}

这给了我错误:'预期可重载一元运算符'。在进一步挖掘时,我发现文档的一部分说 default(T) 是主要运算符:Overloadable Operators .

当你实际点击上面页面上的 default(T) 时,它说 default 是一个关键字。

最重要的是,这个页面并没有说默认是不可重载的:Overloadable Operators (C# Programming Guide) .

我知道这有点学术性,但我正在努力更深入地理解这门语言。什么是默认值(T)?它是运算符还是关键字?为什么不可重载(从语言设计的角度来看)?

更新:是的,我已经阅读了 C# 语言规范第 7.5.13 节,并且我知道该语言的作用。我想了解原因。

最佳答案

@codesinchaos' answer基本上是正确的。一些额外的想法。

假设您创建了一个包含一千个对象的数组。新分配的数组的每个元素都应该初始化为默认值吗?运算符应该被调用一千次吗?

如果运算符在不同时间返回不同的值怎么办?

如果运算符抛出异常怎么办?

在那种情况下,是否可以观察到部分初始化的对象处于“预默认值”状态?

假设 MyObject.Null 是一个字段。 default 运算符运行之前字段的值是多少?那是可观察的吗?您能否进入无限循环,尝试将 MyObject.Null 设置为其默认值,即 MyObject.Null?

等等。这些是语言设计者在考虑此类功能时必须处理的问题。大多数时候,解决方案是不做该功能,而不是尝试找出所有这些棘手问题的答案。

感谢指出文档不足;我会向文档经理提及。

回答您的其他问题:

default 是 C# 语言的保留关键字,从 C# 1.0 开始就有了。以下是它在 C# 中的用法:

  1. default 运算符是一个运算符,其参数必须是类型的名称,如 typeof 运算符或 sizeof运算符(operator)。此功能是在 C# 2.0 中添加的,因为当您在类型系统中使用泛型时它会很方便。引用: default operator .

  2. default 文字:从 C# 7.1 开始,当编译器可以推断表达式时,您可以使用 default 文字生成类型的默认值类型。引用: default literal .

  3. default 也可用于标记 switch 语句的默认情况。

  4. default 可以用作“预处理器”指令的一部分。

关于c# - 什么是默认值,为什么不可覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6472794/

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