C# 封装学习笔记

封装是面向对象编程的三大特性之一,其目的在于隐藏类中的实现细节,仅暴露必要的方法和属性,提高代码的安全性和可维护性。C# 提供了多种方式实现封装。

访问修饰符

C# 中有四个访问修饰符:public、protected、internal 和 private,它们可以用于控制类成员的可见度。其中,public 表示可以从任何地方访问该成员,protected 表示只能在当前类或其子类中访问,internal 表示只能在相同程序集中访问,private 表示只能在当前类内部访问。

下面是一个例子:

csharpCopy Code
public class Person { private string name; protected int age; internal string address; public string GetName() { return name; } public void SetName(string name) { this.name = name; } }

在上面这个例子中,name 使用了 private 访问修饰符,只能在当前类中访问;age 使用了 protected 访问修饰符,只能在当前类和其子类中访问;address 使用了 internal 访问修饰符,只能在相同程序集中访问;GetName 和 SetName 方法使用了 public 访问修饰符,可以从任何地方访问。

属性

属性是一种特殊的方法,用于控制类成员的读取和写入。C# 中的属性通常包含 get 和 set 方法,分别用于获取和设置属性值。

下面是一个例子:

csharpCopy Code
public class Rectangle { private int width; private int height; public int Width { get { return width; } set { width = value; } } public int Height { get { return height; } set { height = value; } } public int Area { get { return width * height; } } }

在上面这个例子中,Width 和 Height 都是属性,可以通过 get 和 set 方法获取和设置宽度和高度;Area 不是属性,而是一个只读属性,用于计算矩形的面积。

索引器

索引器是一种特殊的属性,允许通过下标访问类的成员。C# 中的索引器通常包含一个参数列表,用于指定索引的位置。

下面是一个例子:

csharpCopy Code
public class MyList<T> { private List<T> list = new List<T>(); public T this[int index] { get { return list[index]; } set { list[index] = value; } } public void Add(T item) { list.Add(item); } public void RemoveAt(int index) { list.RemoveAt(index); } public int Count { get { return list.Count; } } }

在上面这个例子中,MyList 是一个泛型类,它包含一个 list 字段和一个索引器,可以通过下标访问列表中的元素;Add 和 RemoveAt 方法用于添加和删除元素;Count 属性用于获取列表中元素的个数。

实例

下面是一个使用封装特性的示例:

csharpCopy Code
using System; public class Program { public static void Main(string[] args) { Person p = new Person(); p.SetName("张三"); Console.WriteLine(p.GetName()); Rectangle r = new Rectangle(); r.Width = 10; r.Height = 20; Console.WriteLine(r.Area); MyList<string> list = new MyList<string>(); list.Add("北京"); list.Add("上海"); list.Add("广州"); Console.WriteLine(list[1]); } }

在上面这个例子中,我们创建了一个 Person 对象,并通过 SetName 方法设置了其名称,然后通过 GetName 方法获取了其名称。接着,创建了一个 Rectangle 对象,通过 Width 和 Height 属性设置了其宽度和高度,然后通过 Area 属性获取了其面积。最后,创建了一个 MyList<string> 对象,通过 Add 方法向其中添加了三个元素,然后通过索引器访问了第二个元素。