CodeGym /课程 /C# SELF /访问修饰符和作用域

访问修饰符和作用域

C# SELF
第 8 级 , 课程 5
可用

1. C#里的主要访问修饰符

写程序的时候,经常想要明确控制一下,从哪儿能看到或者改你的变量、调用你的方法。这就像住在公寓楼:不是所有房间都对所有人开放。有的只有住户能进,有的只有维修工能进。

在编程里,这种“访问控制”就是靠访问修饰符搞定的。它们决定了类的成员(变量、字段、方法、属性等等)能不能被类外面、别的类、别的项目看到。这其实就是OOP里封装的核心:我们把实现细节藏起来,只暴露必要的“接口”给外部用。

下面这张表是主要修饰符和简单说明:

修饰符 哪里能看到?(通俗点说)
public
到处都能看到(项目里、项目外——只要有引用)
private
只有在同一个类里能看到
(没有修饰符)
private一样

看着有点吓人?其实没啥难的。咱们举几个例子,看看啥时候用哪个比较合适。

2. public修饰符——谁都能用

public修饰符让你的变量或方法到处都能看到。如果你把类的成员声明成public,那任何能看到你这个类的代码都能访问它。

public class Person
{
    public string Name;
    public void SayHello()
    {
        Console.WriteLine($"你好!我叫 {Name}");
    }
}
带有 public字段和方法的类示例

现在无论在哪(同一个项目甚至别的项目,只要加了引用),都可以写:

Person p = new Person();
p.Name = "艾丽莎";
p.SayHello();

实用建议:别啥都用public,这对代码安全很关键。

3. private修饰符——私人财产!

private修饰符把类的内容锁起来:外面谁都看不到,也改不了。默认情况下C#里所有字段和方法都是private,除非你写了别的修饰符。

public class Cup
{
    private double volume; // 只有Cup类自己能看到这个字段

    public void Fill(double value)
    {
        volume = value; // 在类内部可以用
    }

    public double GetVolume()
    {
        return volume; // 外面根本不知道有volume这个东西
    }
}
private字段的用法示例

这里volume对外部完全隐藏,但类里的任何方法都能用。想知道容量,我们提供了一个公开方法GetVolume()

4. 作用域:变量、方法和类

作用域就是你程序里某个名字(变量、方法、类)有意义、能用的范围。

  • 局部变量(在方法或代码块里声明的):只在这个方法或块里能用。
  • 方法参数:只在方法内部能用。
  • 类字段:在整个类里都能用(当然还得看访问修饰符)。
  • 类:嵌套类如果是private,只在外部类里能用,等等。

来看个作用域的例子:

public class Counter
{
    private int count = 0; // 在整个类里都能看到

    public void Increment()
    {
        count++;   // 可以用字段
        int temp = count * 2; // temp只在Increment里能用
    }

    public int GetCount()
    {
        // 这里temp就看不到了!
        return count;
    }
}
变量作用域的例子

如果你想在GetCount()里用temp,会报错的。

5. 变量遮蔽(shadowing)

遮蔽就是在一个作用域里声明了和外部作用域同名的变量(或参数)。在这个块里,“新”名字遮住了旧的,直接访问外部的就不行了。

遮蔽的例子:

class ShadowDemo
{
    int value = 10; // 类字段

    void PrintValue()
    {
        Console.WriteLine(value);      // 10 —— 类字段
        int value = 5; // 局部变量遮蔽了类字段
        Console.WriteLine(value); // 打印5,不是10
    }
}
变量遮蔽(shadowing)示例

在这个例子里,写int value = 5;,就遮蔽了方法里的同名类字段。PrintValue()里访问value,用的是局部变量,不是类字段。

如果你非要访问类字段,可以用关键字this

class ShadowDemo
{
    int value = 10;

    void PrintValue()
    {
        Console.WriteLine(value);      // 10 —— 类字段
        int value = 5;
        Console.WriteLine(value);      // 5 —— 局部变量
        Console.WriteLine(this.value); // 10 —— 类字段
    }
}
遮蔽时用 this访问类字段

遮蔽容易让人迷糊,所以建议变量名要有意义、别重名——尤其是团队开发的时候。

1
调查/小测验
函数第 8 级,课程 5
不可用
函数
函数入门
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION