什么是默认,为什么不能重写

本文关键字:不能 重写 为什么 默认 什么 | 更新日期: 2023-09-27 18:00:13

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

由于C#提供了默认的操作符,我试图像这样重载它:

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

这给了我一个错误:"需要可重载的一元运算符"。在进一步的挖掘中,我发现文档中有一部分说default(T)是Primary运算符:Overloadable运算符。

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

最重要的是,这个页面并没有说默认值是不可重载的:可重载运算符(C#编程指南)。

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

更新:是的,我已经阅读了C#语言规范第7.5.13节,我知道该语言的作用。我正在努力理解为什么。

什么是默认,为什么不能重写

@codesinchaos的回答基本上是正确的。还有一些其他想法。

假设你制作了一个由一千个对象组成的数组。新分配的数组中的每个元素都应该初始化为默认值吗?操作员应该被调用一千次吗?

如果操作员在不同的时间返回不同的值,该怎么办?

如果操作员抛出异常怎么办?

在这种情况下,可以观察到一个部分初始化的对象处于";预设值";状态

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

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

感谢您指出文件有缺陷;我会向文档经理提起的。

回答您的其他问题:

CCD_ 2是C#语言的保留关键字,并且从C#1.0开始就存在。以下是它在C#中的用法:

  1. default运算符是一个运算符,其参数必须是类型的名称,如typeof运算符或sizeof运算符。这个特性是在C#2.0中添加的,因为当类型系统中有泛型时,它很方便。引用:默认运算符

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

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

  4. CCD_;预处理器";指令。

重载default会使C#的设计和运行时显著复杂化。目前,假设任何值类型的二进制归零都是有效的,并且等效于该值类型的default。对于引用,null引用总是有效的,并且等价于任何引用类型的default

这允许运行时开始在二进制零状态的对象上运行构造函数,并获得正常的行为。

然后我开始想:不是吗如果该的默认值业务对象是null对象而不是空引用?

听起来您的项目将受益于使用IOC容器,该容器可以在默认情况下注入NullBusinessObject实例,该实例可以作为默认行为执行您希望它执行的任何操作。C#本身没有提供任何可以在这方面覆盖的内置内容。

default(T)通常"清零"为类创建一个null引用,并为值类型创建一个清零版本(C#中的结构)。default是C#中的关键字,也是MSIL中的运算符。C#不允许覆盖默认值。