C# 入门之访问修饰符(补充)

写了一大半,发现写崩了,前面有很多东西没有写到,这两天会添加一些补充的内容。

今天我们首先来看一下 C# 中的访问修饰符。

在 C# 中,不管是类型成员都有一个访问级别,这个级别可以控制你程序中的定义的内容,能不能被其他代码使用,我们通常把访问级别称为访问修饰符(Access Modifier)。

在 C# 中,有以下几种访问修饰符:
public:访问不受任何限制;
protected:只限本类或子类成员访问,其他实例成员都不能访问;
private:只限本类成员访问,子类和其他实例成员不能访问;
internal:只限于本项目内访问;

下面我们来看一个示例:public
通过右击项目名,选项 Add item,添加一个 Class 文件

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp23
{
    class TestClass
    {
        public string name = "Aaron";    // 数据类型为 public
        public int age = 28;
    }
}

更改主文件:

using System;

namespace ConsoleApp23
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new TestClass();    // 在主文件中调用 Class
            Console.WriteLine($"{p.name} is {p.age} years old.");
        }
    }
}

运行结果:

Aaron is 28 years old.

新建一个项目文件:

下面我们来看一下 protected 的示例,我们直接修改前面的代码:将 Class 中的数据类型改成 protected

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp23
{
    class TestClass
    {
        protected string name = "Aaron";
        protected int age = 28;
    }
}

我们会发现 VS 下面的 Error 窗口,显示了错误:
https://ithelp.ithome.com.tw/upload/images/20210927/20099494N3FtolLLhA.png

修改主程序代码:

using System;

namespace ConsoleApp23
{
    class Program:TestClass   // 创建一个子类(Class)
    {
        static void Main(string[] args)
        {
            var p = new Program();
            Console.WriteLine($"{p.name} is {p.age} years old.");
        }
    }
}

这次没有报错,运行结果:

Aaron is 28 years old.

当再次将 Protected 改成 private,代码又出现了错误:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp23
{
    class TestClass
    {
        private string name = "Aaron";
        private int age = 28;
    }
}

错误内容,如图所示:
https://ithelp.ithome.com.tw/upload/images/20210927/20099494z91Dn7cYMY.png

private 的数据没办法直接被其他 Class 调用,但我们可以通过使用 public 的方法,来实现调用,修改 Class 文件代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp23
{
    class TestClass
    {
        private string name = "Aaron";
        private int age = 28;

        public string GetName()     // 创建 public 方法,并通过 return 返回值
        {
            return name;
        }

        public int GetAge()
        {
            return age;
        }
    }
}

修改主程序代码:

using System;

namespace ConsoleApp23
{
    class Program:TestClass
    {
        static void Main(string[] args)
        {
            var p = new TestClass();
            string n = p.GetName();    // 调用 public 方法
            int a = p.GetAge();
            Console.WriteLine($"{n} is {a} years old.");
        }
    }
}

命令输出:

Aaron is 27 year old.

我们再来看看 internal,我们将前面一个项目文件中的 class 改成 internal 类型:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp23
{
    class TestClass
    {
        internal string name = "Aaron";
        internal int age = 28;
    }
}

更改主程序文件:

using System;

namespace ConsoleApp23
{
    class Program:TestClass
    {
        static void Main(string[] args)
        {
            var p = new TestClass();
            string n = p.name;
            int a = p.age;
            Console.WriteLine($"{n} is {a} years old.");
        }
    }
}

运行程序:可以正常运行。

Aaron is 28 years old.

现在我们重新添加一个项目文件(右击 Solution,并选择 Add,添加一个新的项目文件),并引用前面一个项目(引用需要在项目 > 项添加项目引用中添加。):

using System;
using ConsoleApp23;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var p = new TestClass();
            string n = p.name;
            int a = p.age;
            Console.WriteLine($"{n} is {a} years old.");
        }
    }
}

发现下面报错:
https://ithelp.ithome.com.tw/upload/images/20210927/20099494KjSJMwUxPH.png

将 class 和数据的类型,改成 public 就可以了。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp23
{
    public class TestClass
    {
        public string name = "Aaron";
        public int age = 28;
    }
}

在 C# 中还有两个组合的访问修饰符:protected internal 和 private protected。

下面是官方的关于访问修饰符的摘要表:
https://ithelp.ithome.com.tw/upload/images/20210927/20099494wBtpnS43ah.png


<<:  [Day 6] Route group

>>:  Powershell 入门之逻辑判断(下)

Day14 - Google Kubernetes Engine 基础 - Deployment 介绍

什麽是 Deployment ? 前几天的教学中我们使用 Pod 加上 Service 在 Kube...

Wondershare Recoverit档案救援软件替代救援方案 • 猫噗知识+

如果家里、公司或学校电脑上的重要档案损坏或丢失,您一定会非常着急。不要担心,本文将爲您介绍一款适合...

Day05 UIKit 04 - 在 Storyboard 上设计画面

在 Storyboard 上设计画面 接下来我们来在一开始建立的专案上设计画面,首先我们在专案导览器...

Day 18 Sort

演算法在程序设计中扮演重要的角色,而演算法和时间复杂度有很大的关联, 时间复杂度本意为程序执行的时间...

【课程推荐】2021/1/23~1/24 软件需求与系统分析实务班

课程对象 软件专案开发商之业务人员与Pre-Sales、软件系统专案经理、软件系统系统分析师。 详细...