iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Software Development

C# 入门系列 第 21

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


上一篇
C#入门之文本处理(下)
下一篇
C# 入门之运算符(补充)
系列文
C# 入门32

尚未有邦友留言

立即登入留言