正在加载...

作用域

写一个名为 mark、带一个参数的方法:static void mark(int n)。在花括号里用 Console.WriteLine(n); 写出该参数。从 Main 调用 mark(4);。屏幕应显示一行:4。名称 n 只存在于 mark 内。若你尝试从 Main 写出 n,生成会拒绝。这条边界——方法能看见哪些名称——就是本页要教的内容。请保留公共类名 Pine。

留在方法里的名称

在重载页上,几个 paint 方法共用一个名称,但各自保留不同的参数列表。这里焦点更小:一个方法、一个参数名,以及该名称允许出现的位置。参数是属于声明它的方法的名称。出了该方法的花括号,名称就不在了。
打开 Pine 文件。类名保持 Pine。本页不重命名类型。若你仍只有 paint 演示,且那就是 Main 里的全部内容,删掉它。删掉任何残留的 twice。删掉任何 ReadLine 行。你保留的文件不等待键入。
在 Main 之外、仍在类的花括号内,写下 static void mark(int n)。方法体只有一行写出:Console.WriteLine(n);。本页保持 void。你在看可见性,不是返回值。运行前先保存文件。完整的第一个程序在下一个代码框里。

你保留的文件

这是你首先运行的版本。Main 持有调用。mark 持有使用 n 的写出行。

mark writes its parameter

csharp
using System;

public class Pine
{
    public static void Main()
    {
        mark(4);
    }

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

从头读起。using System; 准备短名称。public class Pine 命名类型。public static void Main() 是运行时开始的地方。调用 mark(4) 把 4 送进参数 n。在 mark 内,Console.WriteLine(n) 写出 4。当 mark 结束时,名称 n 也结束了。Main 从未持有名称 n。数字 4 作为值穿过调用。名称 n 没有移进 Main。屏幕上一行:4。

用 dotnet run 运行。程序写出一行后停止。它不等你键入。若 dotnet run 在等待,文件里仍有 ReadLine。删掉那一行,保留 mark(4); 以及上面的 mark 方法。屏幕显示 4。若屏幕显示 ok,仍在运行残留的 paint("ok") 调用。若屏幕显示字母 n,写出行带了引号:Console.WriteLine("n");。屏幕显示错误行时,不要重装 .NET SDK。

按顺序走完一次完整运行。C# 从 Main 开始。调用 mark(4) 把 4 送进参数 n。在 mark 内,WriteLine(n) 写出 4。当 mark 结束时,名称 n 也结束了。Main 从未持有名称 n。数字 4 作为值穿过调用。名称 n 没有移进 Main。
若在调用之后于 Main 内加入 Console.WriteLine(n);,生成会报告找不到名称 n。这个错误就是课程在起作用:n 从未在 Main 中声明。修正办法是从 Main 删掉那一行,或在 Main 需要局部时声明另一个名称。不要指望 mark 的参数会自己出现在 Main 里。

参数旁的局部名称

在 mark 内你也可以声明一个不是参数的新名称。该局部名称只活在 mark 的花括号之间。初学者常见的希望是:在 Main 声明的名称会自动在类的每个方法里可见。在本形状下并非如此。若 Main 有 int room = 4;,而 mark 未接收就尝试写出 room,生成在 mark 内找不到 room。修正是传入该值:mark(room);,同时 mark 仍声明为 mark(int n)。

把 Main 的局部传入 mark

在 Main 内声明 int room = 4;。调用 mark(room);。在 mark 内继续写出 n。屏幕仍显示 4。Main 里的局部名是 room。mark 里的参数名是 n。它们是不同位置上的不同名称。旅行的是值 4。

pass room into mark

csharp
using System;

public class Pine
{
    public static void Main()
    {
        int room = 4;
        mark(room);
    }

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

这是第二个文件。它用 Main 中的局部教同样的可见性。运行 dotnet run。你仍看到一行:4。若把 room 改成 9 且不改方法体,屏幕显示 9。方法仍写出到达 n 的任何值。若在 Main 中加入 Console.WriteLine(room);,Main 也可以写出 room——该名称属于那里。Main 仍不能写出 n。看过 room 形状后,若你想保存的是单次调用形状,把保留文件改回:Main 里的 mark(4);。
若 mark 声明自己的局部——例如在花括号内 int tag = 1;——该 tag 对 Main 不可见。在 Main 里尝试 Console.WriteLine(tag); 会失败,原因与从 Main 写出 n 相同。mark 的花括号是其内部所声明名称的一堵墙。

墙保护什么

用平常话读清这条分界。在 Main 声明的名称留在 Main,除非你把它们的值传入调用。在 mark 声明的名称——参数与局部——留在 mark。调用携带的是值,不是名称本身。上一页的重载是另一种技能:几个方法共用一个方法名。作用域讲的是变量或参数名称允许出现在源码的哪里。
残留的 paint 演示可能仍留在同一文件里;若 Main 仍调用 paint("ok"),屏幕会混淆。把 Main 清到你正在测试的 mark 调用。不要把 mark 嵌进 Main 的花括号里。方法放在类内、与 Main 并列。
在 Main 里写 Console.WriteLine("n"); 会写出引号里的字母 n。它并不写出参数。当你想要经调用传来的值时,把 Console.WriteLine(n) 留在 mark 内。页头仍是 mark(int n) 时,写空括号的 mark(); 会失败——调用必须送入一个 int,可以是字面量 4,也可以是局部 room。

你可以写出 mark(int n),在该方法内写出 n,并把 n 留在 Main 之外。你可以在 Main 声明 room,并把 room 传入 mark。屏幕显示穿过调用的值。名称不会自行从花括号渗漏出去。下一页是 recursion:方法用更小的实参调用自己,直到停止条件结束这条链。

屏幕持有穿过的值

你保留的文件在 Main 调用 mark(4); 时写出 4。名称 n 在 mark 内的写出行上;除非你给它加了引号,字母 n 不会作为打印标签出现在屏幕上。把 mark 嵌进 Main 不是本课构建的形状。

🧠 测试您的知识

准备开始

测试您的知识

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

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

📝 说明

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