正在加载...

重载

在同一个类里放两个都使用名称 paint 的方法。一个页头是 static void paint(string word)。另一个是 static void paint(int n)。方法体很短:第一个写出 word,第二个写出 n。从 Main 调用 paint("ok");,再调用 paint(3);。屏幕应显示两行:第一行 ok,第二行 3。C# 不把第二个 paint 当成冲突。它把两个页头当成不同方法,因为参数列表不同。同名但列表不同,就是本页要教的内容。请保留公共类名 Pine。

同名,不同列表

到目前为止,每个新想法都用新的方法名:ring、greet、twice。这里故意让名称保持 paint。改变的是括号之间的内容。一个列表放 string。另一个列表放 int。编译器保留两者,因为那些列表并不相同。
打开 Pine 文件。类名保持 Pine。本页不重命名类型。若你仍只有返回 n * 2 的 twice 演示,且那就是 Main 里的全部内容,删掉它。删掉任何残留的 greet。删掉任何 ReadLine 行。你保留的文件不等待键入。
在 Main 外、仍在类的花括号内,写出两个 paint 页头。本页保留 void:每个方法体都写出内容,不需要通过 return 把任何东西交回 Main。第一个方法体用 Console.WriteLine(word);。第二个用 Console.WriteLine(n);。运行前先保存文件。完整的第一个程序在下一个代码框里。

你要保留的文件

这是你先运行的版本。Main 里有两次调用。类里有两个同名的 paint 方法。

paint string and paint int

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("ok");
        paint(3);
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }

    static void paint(int n)
    {
        Console.WriteLine(n);
    }
}

从顶部读起。using System; 准备短名称。public class Pine 给类型命名。public static void Main() 是运行时开始的地方。第一次调用是 paint("ok")。实参是 string,所以 C# 运行接受 string word 的方法体并写出 ok。第二次调用是 paint(3)。实参是 int,所以 C# 运行接受 int n 的方法体并写出 3。名称 paint 两次都相同。括号里的列表决定方法体。屏幕两行:ok,然后 3。

用 dotnet run 运行。程序写出两行后停止。它不等你键入。若 dotnet run 在等待,文件里还有 ReadLine。删掉那一行,保留两次 paint 调用以及上面的两个 paint 方法。屏幕显示 ok,然后 3。若两行都是 ok,你可能只留下了 string 方法,并对每次调用写出固定单词。若两行都是 3,你可能只留下了 int 方法。请保留两个页头。若生成报告说 paint 已定义,检查两个页头是否同一列表——例如两份 paint(string word)。重载需要列表上的真实差异,而不是仅参数名不同的同一页头第二份拷贝。屏幕行不对时不要重装 .NET SDK。

带两个词的第二份列表

参数个数也可以不同。再加第三个重载:接受两个 string 值,并在一行里用空格写出它们。练习三个一起时,保留前两个 paint 方法。若只想集中演示这种形状,可以用只含这份列表的文件。

paint two strings

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("hi", "sam");
    }

    static void paint(string a, string b)
    {
        Console.WriteLine(a + " " + b);
    }
}

这是第二个文件。它把个数当作列表差异来教。运行 dotnet run。屏幕应显示一行:hi sam。调用有两个实参。方法有两个参数。这种匹配足以让 C# 选定这个方法体。若同一个类里仍有更早的 paint(string word) 和 paint(int n),可以保留。带两个 string 值的调用不会选单实参 string 方法,因为个数不同。
当你把三个重载放进一个文件练习时,Main 可以在各自一行调用每种形状。一个 string 的调用仍去 paint(string word)。一个 int 的调用仍去 paint(int n)。两个 string 值的调用去 paint(string a, string b)。同名不会抹掉这些区别。看过 hi sam 之后,若你想保存的是两次调用的形状,把保留文件放回去:paint("ok"); 然后 paint(3);。

空列表旁的 string 列表

带空括号的方法也是不同的列表。你可以在 paint(string word) 旁保留无参数的 paint()。空调用 paint(); 运行空列表方法体。调用 paint("go"); 运行 string 方法体。

paint empty and paint string

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint();
        paint("go");
    }

    static void paint()
    {
        Console.WriteLine("ready");
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }
}

这是第三个文件。运行 dotnet run。屏幕应先显示 ready,再显示 go。第一次调用括号之间什么也没有,因此匹配 paint()。第二次调用送出一个 string,因此匹配 paint(string word)。把其中一个改名为 paintReady 也能生成,但那是另一种技能。本页保留名称 paint,让列表承担差异。

哪次调用运行哪个页头

把调用与页头并排阅读。调用里的实参列表必须契合页头里的参数列表。在这种入门形状里,类型和个数都重要。

📊 call beside matching paint

Call in Main Header that runs Screen line
paint("ok"); paint(string word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(string a, string b) hi sam
paint(); paint() ready

常见混淆是写两个都写着 paint(string word) 的方法,并指望第二个算重载。只把参数名改成 paint(string label) 不会给编译器造出新列表。这里重要的是类型和个数。另一种混淆是调用 paint(true),却从未写过 bool 参数列表。那时生成找不到匹配的 paint。加上接受你想要类型的页头,或把调用改成你已支持的类型。
在 Main 里写 Console.WriteLine("paint"); 会写出单词 paint。它不调用任何方法。当你想要接受 string 的重载时,保留 paint("ok");。同一文件里留下的 twice 方法可能弄乱屏幕,若 Main 仍写出 twice(7)。把 Main 清到你正在测试的 paint 调用,并只保留那次运行需要的 paint 重载。
不要把 paint 方法嵌进 Main 的花括号里。方法放在类里面,与 Main 并列。两个重载是同一类体中的两个并列方法。

你可以在同一个类里保留一个方法名和几份参数列表。C# 根据调用的实参列表选定方法体。屏幕显示匹配方法体写出的那一行。两个相同列表的页头不是重载。下一页是 scope:你会看到哪些名字在方法内部可见,哪些留在外面。

屏幕保留匹配的方法体

你保留的文件在 Main 调用 paint("ok"); 和 paint(3); 时写出 ok,然后 3。共享名称 paint 出现在每次调用里,而字母 paint 不会作为打印标签出现在屏幕上,除非你给它们加了引号。把 paint 方法嵌进 Main 不是本课构建的形状。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部