访问修饰符

在类内部,任意函数成员都能直接通过名称访问本类其他所有成员。

访问修饰符是成员声明的可选前缀,用于限定程序其他代码能否访问该成员,写在类型、方法名之前。

字段

访问修饰符 类型 字段名

方法

访问修饰符 返回类型 方法名()
{
    ...方法体
}

5 种访问权限

  1. private 私有
  2. public 公开
  3. protected 受保护
  4. internal 内部
  5. 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)
  1. 私有成员(F1、F2、DoCalc ()):仅C1类内部代码能读写调用,外部类完全不可见;
  2. 公开成员(F3、GetVal ()):程序任意其他类 / 对象都能无限制访问;
  3. 类内部规则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)

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注