1. C#里的主要访问修饰符
写程序的时候,经常想要明确控制一下,谁、从哪儿能看到或者改你的变量、调用你的方法。这就像住在公寓楼:不是所有房间都对所有人开放。有的只有住户能进,有的只有维修工能进。
在编程里,这种“访问控制”就是靠访问修饰符搞定的。它们决定了类的成员(变量、字段、方法、属性等等)能不能被类外面、别的类、别的项目看到。这其实就是OOP里封装的核心:我们把实现细节藏起来,只暴露必要的“接口”给外部用。
下面这张表是主要修饰符和简单说明:
| 修饰符 | 哪里能看到?(通俗点说) |
|---|---|
|
到处都能看到(项目里、项目外——只要有引用) |
|
只有在同一个类里能看到 |
|
和private一样 |
看着有点吓人?其实没啥难的。咱们举几个例子,看看啥时候用哪个比较合适。
2. public修饰符——谁都能用
public修饰符让你的变量或方法到处都能看到。如果你把类的成员声明成public,那任何能看到你这个类的代码都能访问它。
public class Person
{
public string Name;
public void SayHello()
{
Console.WriteLine($"你好!我叫 {Name}");
}
}
现在无论在哪(同一个项目甚至别的项目,只要加了引用),都可以写:
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这个东西
}
}
这里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
}
}
在这个例子里,写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 —— 类字段
}
}
遮蔽容易让人迷糊,所以建议变量名要有意义、别重名——尤其是团队开发的时候。
GO TO FULL VERSION