gpt4 book ai didi

c# - 方法覆盖和可选参数

转载 作者:IT王子 更新时间:2023-10-29 04:09:28 24 4
gpt4 key购买 nike

有人愿意解释这段代码如何产生以下输出吗?

using System;

namespace ConsoleApplication1
{
class Test
{
public override string ToString() { return "ToString override"; }
public string ToString(string optional = "")
{ return String.Format("ToString with optional parameter {0}", optional); }
}

class Test2
{
public new string ToString() { return "ToString new"; }
public string ToString(string optional = "")
{ return String.Format("ToString with optional parameter {0}", optional); }
}

class Program
{
static void Main(string[] args)
{
Test one = new Test();
Test2 two = new Test2();
Console.WriteLine(one);
Console.WriteLine(one.ToString());
Console.WriteLine(one.ToString("foo"));
Console.WriteLine("--");
Console.WriteLine(two);
Console.WriteLine(two.ToString());
Console.WriteLine(two.ToString("bar"));
Console.ReadKey();
}
}
}

ToString override

ToString with optional parameter

ToString with optional parameter foo

--

ConsoleApplication1.Test2

ToString new

ToString with optional parameter bar

最佳答案

好吧,既然大家都感兴趣,这里有一个快速版本:

Console.WriteLine(一条)

这将使用 WriteLine(object) 重载,它将依次执行 object.ToString() 虚方法,在 One 中重写> - 因此 ToString override

的输出

Console.WriteLine(one.ToString())

这将查看 One 并查看哪些方法具有新声明的方法 - 折扣覆盖。只有一种适用的方法 - 带有可选参数的方法。因此使用默认值执行,导致输出 ToString with optional parameter

Console.WriteLine(one.ToString("foo"))

同样,但这次编译器不需要使用默认值,因此 ToString with optional parameter foo

Console.WriteLine(二)

同样,这将从 WriteLine(object) 调用虚拟 object.ToString() 方法。该方法未被重写,因此使用返回类型名称的默认实现,导致 ConsoleApplication1.Test2 的输出。

Console.WriteLine(two.ToString())

编译器查看在 Two 中声明的所有方法,这些方法没有覆盖虚方法。在这种情况下,有两种这样的方法——无参数的方法和带有可选参数的方法。包含无参数方法是因为它是新的,而不是重写基类方法。

无参数方法被认为是“更好”的候选方法,因为编译器更喜欢调用不需要填写任何可选参数的方法。因此输出为 ToString new

Console.WriteLine(two.ToString("bar"))

同样,编译器会查看在 Two 中声明的所有方法,这些方法没有覆盖虚拟方法。在这种情况下,有两种这样的方法——但无参数的方法不适用,只留下带有可选参数的方法。编译器不需要在这里使用可选参数的默认值,因为无论如何它都有一个参数...所以输出是 ToString with optional parameter bar

有关这方面的更多信息,请阅读 C# 语言规范 - 或者对于中途之家,请参阅我的 article on overloading .

关于c# - 方法覆盖和可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13825113/

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