在类内部,任意函数成员都能直接通过名称访问本类其他所有成员。
访问修饰符是成员声明的可选前缀,用于限定程序其他代码能否访问该成员,写在类型、方法名之前。
字段
访问修饰符 类型 字段名
方法
访问修饰符 返回类型 方法名()
{
...方法体
}
5 种访问权限
private私有public公开protected受保护internal内部protected internal受保护内部
暂时读者先学习private和public就可以。后续课程再学习后面的。
类的内部不管什么类型,都可以访问
看一个例子
class Robot
{
public string name;
int age;
public void SayHello()
{
Console.WriteLine($"Hello erveryone my name is {name},I come form Foxdevelop.com");
Console.WriteLine($"I am {age} years old");
}
void AgeUpdate()
{
age = age+1;
}
void SayHi()
{
SayHello();
}
}Code language: C# (cs)

上面例子,大家可以看到不管是公共的public函数SayHello ,也不管是私有的private的函数AgeUpdate和SayHi,也不管这个age是private还是这个name是public,只要是在class的内部,是可以互相访问的。
要注意,不要互相访问,会导致死循环的。例如
class Robot
{
public string name;
int age;
public void SayHello()
{
Console.WriteLine($"Hello erveryone my name is {name},I come form Foxdevelop.com");
Console.WriteLine($"I am {age} years old");
SayHi();
}
void AgeUpdate()
{
age = age+1;
}
void SayHi()
{
SayHello();
}
}Code language: C# (cs)
以上SayHi中调用了SayHello,然后SayHello又访问了SayHi。互相调用会导致循环的。

然后程序崩溃
提示内存溢出

另外,字段也不能直接调用函数的,除非这个函数是静态的,因为如果你直接字段的左侧初始化的时候,调用函数,我们知道成员函数是必须通过对象名访问的。

class Robot
{
public string name;
int age = GetInt();
static int GetInt()
{
return 1;
}
public void SayHello()
{
Console.WriteLine($"Hello erveryone my name is {name},I come form Foxdevelop.com");
Console.WriteLine($"I am {age} years old");
}
void AgeUpdate()
{
age = age+1;
}
void SayHi()
{
SayHello();
}
}Code language: C# (cs)
像上图那样,改为静态的,就可以,但是大家要注意,这里给age赋值,如果GetInt里面return的值不固定
class Program
{
static void Main(string[] args)
{
Robot robot1 = new Robot();
for (int i = 0; i < 100; i++)
{
robot1.WriteAge();
System.Threading.Thread.Sleep(1000);
}
}
}
class Robot
{
public string name;
int age = GetInt();
static int GetInt()
{
return DateTime.Now.Second;
}
public void WriteAge()
{
Console.WriteLine($"I am {age} years old");
}
}Code language: C# (cs)
比如上面代码,GetInt里面返回当前时间的秒数,然后Main中调用100此 for (int i = 0; i < 100; i++) 输出年龄的函数。每次输出后,就暂停一秒(System.Threading.Thread.Sleep(1000);),然后再执行。我们发现

输出的秒数都是当时获取的时候的秒数,也就是在设置age的时候,调用GetInt的函数的时候,获得的整数是当时的秒数是45,然后age就固定了是这个45了,后续你无论输出多少次,都是这个45。 这就是上一节说的,字段需要在编译期间要确定。
现在回到我们的访问修饰符哪里
总的来说,就是,在类的内部,是可以访问的,不管是什么修饰符。
private 私有访问
私有成员仅能在声明它的类内部访问,其他任何类都无法读取、修改。
类成员默认访问级别就是 private,不写修饰符等价于显式写private,两种写法语义完全一致
int MyInt1; // 隐式私有(默认)
private int MyInt2; // 显式私有Code language: C# (cs)
public 公开访问
实例的公开成员允许程序内所有其他对象访问,必须手动添加public修饰符声明
public int MyInt; // public访问修饰符标记Code language: C# (cs)
成员可视化规则
我们经常会用一种类图来描述类
类整体用方框表示,成员是类内部小方框;
private成员:完全包裹在类方框内部,外部不可见;
public成员:方框一部分伸出类外部,代表全局可访问。
class Program
{
int Member1; // implicit private
private int Member2; // explicit private
public int Member3; // public
}Code language: C# (cs)

本章例子
class C1
{
int F1; // 隐式私有字段
private int F2; // 显式私有字段
public int F3; // 公开字段
void DoCalc() // 隐式私有方法
{
...
}
public int GetVal() // 公开方法
{
...
}
}Code language: C# (cs)
- 私有成员(F1、F2、DoCalc ()):仅
C1类内部代码能读写调用,外部类完全不可见; - 公开成员(F3、GetVal ()):程序任意其他类 / 对象都能无限制访问;
- 类内部规则:
C1自身所有方法,不管公私,都可以互相访问本类全部字段、方法。
可以运行的例子
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker();
Console.WriteLine(worker.GetHours()); // 正确 可以在类外面访问公开成员GetHours
Console.WriteLine(worker.ReadSavings());//错误 无法在类外面访问私有成员ReadSavings 哪怕用实例名worker.也不行
Console.WriteLine(worker.hours); // 正确 可以在类外面访问公开成员hours
Console.WriteLine(worker.savings); //错误 无法在类外面访问私有成员savings 哪怕用实例名worker.也不行
Console.WriteLine(worker.age); //错误 无法在类外面访问私有成员age 哪怕用实例名worker.也不行
}
}
class Worker
{
int age; // 隐式私有字段
private double savings; // 显式私有字段
public int hours; // 公开字段
void ReadSavings() // 隐式私有方法
{
Console.WriteLine(savings);
}
public int GetHours() // 公开方法
{
return hours;
}
}Code language: C# (cs)

现在大家应该对修饰符有一定的了解了