C#封装

C# 是一门面向对象编程语言,面向对象编程语言有三大特性,分别是封装、继承多态。所谓封装就是将一个或多个项目(函数)集合在一个单元中,这个单元称之为类,我们可以根据需要通过访问权限修饰符来设定类中成员的范围和可见性。C# 中的访问权限修饰符有以下几种:
  • public:公共的,所有对象都可以访问,但是需要引用命名空间;
  • private:私有的,类的内部才可以访问;
  • internal:内部的,同一个程序集的对象可以访问,程序集就是命名空间;
  • protected:受保护的,类的内部或类的父类和子类中可以访问;
  • Protected internal:protected 和 internal 的并集,符合任意一条都可以访问。

1、public

类中使用 public 访问权限修饰符修饰的成员变量或成员函数可以在其他函数和对象,我们可以从类的外部访问类中的公共成员(使用 public 修饰的类成员)。下面通过一个示例来演示一下:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            Rectangle Obj = new Rectangle();
            Obj.width = 5.5;
            Obj.length = 3;
            Obj.Display();
            Console.ReadLine();
        }
    }
    class Rectangle
    {
        // 成员变量
        public double width, length;

        public double GetArea(){
            return width * length;
        }
        public void Display(){
            Console.WriteLine("长方形的长:{0}", length);
            Console.WriteLine("长方形的宽:{0}", width);
            Console.WriteLine("长方形的面积:{0}", GetArea());
        }
    }
}
运行结果如下:

长方形的长:3
长方形的宽:5.5
长方形的面积:16.5

上面的示例中,成员变量 length 和 width 都是使用 public 修饰的,所以可以在 Main 函数中使用 Rectangle 类的实例来进行访问。

2、private

类中使用 private 访问权限修饰符修饰的成员变量或成员函数不能在其它函数或对象访问,即使是类的实例也不能访问这个类中的私有成员,只有同属一个类的函数才可以访问这个类的私有成员。

下面通过一个示例来演示一下:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            Rectangle Obj = new Rectangle();
            Obj.AcceptDetails();
            Obj.Display();
            Console.ReadLine();
        }
    }
    class Rectangle
    {
        // 成员变量
        private double width, length;

        public void AcceptDetails(){
            Console.WriteLine("请输入长方形的长度: ");
            length = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入长方形的宽度: ");
            width = Convert.ToDouble(Console.ReadLine());
        }
        public double GetArea(){
            return width * length;
        }
        public void Display(){
            Console.WriteLine("长方形的长:{0}", length);
            Console.WriteLine("长方形的宽:{0}", width);
            Console.WriteLine("长方形的面积:{0}", GetArea());
        }
    }
}
运行结果如下:

请输入长方形的长度:
12.3
请输入长方形的宽度:
23.4
长方形的长:12.3
长方形的宽:23.4
长方形的面积:287.82

上面的示例中,成员变量 length 和 width 使用 private 修饰,因此无法通过 Demo 类中的 Main 函数访问,只能通过 Rectangle 类中的成员函数 AcceptDetails() 和 Display() 来访问这些变量。又因为 Rectangle 中的成员函数 AcceptDetails() 和 Display() 是使用 public 修饰的,因此可以使用 Rectangle 类的实例 Obj 来调用它们。

3、protected

类中使用 protected 访问权限修饰符修饰的成员变量和成员函数可以在其子类中访问,也就是说基类(父类)中使用 protected 访问权限修饰符修饰的成员变量和成员函数可以在其子类中访问,这样有助于实现继承。关于继承我们将后面的章节详细介绍。

4、internal

类中使用 internal 访问权限修饰符修饰的成员变量和成员函数可以在当前程序集中的其他函数或对象中使用。换句话说就是,任何使用 internal 修饰的成员都可以被同一命名空间下的任何类或方法访问。

下面通过一个示例来演示一下:
using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            Rectangle Obj = new Rectangle();
            Obj.length = 33.3;
            Obj.width = 22.2;
            Obj.Display();
            Console.ReadLine();
        }
    }
    class Rectangle
    {
        // 成员变量
        internal double width, length;

        double GetArea(){
            return width * length;
        }
        public void Display(){
            Console.WriteLine("长方形的长:{0}", length);
            Console.WriteLine("长方形的宽:{0}", width);
            Console.WriteLine("长方形的面积:{0}", GetArea());
        }
    }
}
运行结果如下:

长方形的长:33.3
长方形的宽:22.2
长方形的面积:739.26

上面的示例中,没有使用任何访问权限修饰符修饰的成员函数 GetArea() 默认是私有的。

5、protected internal

类中使用 protected internal 访问权限修饰符修饰的成员可以在本类、派生类或者包含该类(使用 using 引入)的程序集中访问,在实现继承时也使用此方法。