跳转到内容

C# 编程/封装2

来自维基教科书,自由的教科书

属性封装了对对象状态的控制。

例如,以下Customer 类封装了客户的姓名

public class Customer
{ 
  // "private" prevents access of _name outside the Customer class:
  private string _name;   

  // The following property allows programmatic changes to _name:
  public string Name
  {
      set { this._name = value; }
      get { return this._name; }
  }
}

上面的Name 属性包含三个重要部分:声明、设置访问器获取访问器

属性声明

[编辑 | 编辑源代码]
<access modifier> <type> <property name> 
public string Name

访问修饰符决定了谁可以操作这些数据。属性可以被限定为publicprivateprotectedinternal

类型决定了它可以接受或返回的类型。

属性名称声明了用于访问属性的名称。

访问器

[编辑 | 编辑源代码]

使用设置访问器设置Customer 类中的Name 属性,它使用set 关键字定义。

类似地,get 关键字创建一个获取访问器,用于封装当客户端检索属性值时要执行的逻辑。

上面,简单的设置访问器获取访问器使属性的行为非常类似于简单的字段。这可能不是我们想要的。如果不是,我们可以添加逻辑来检查传递到set 访问器中的值

public string Name
       {
           set { 
                 if (value != null)
                    this._name = value;
               }
           get {                   
                 if (this._name != null)
                    return this._name;
                 else
                    return "John Doe";
               }
       }

上面,如果客户端请求将值设置为null,则设置访问器不会更改字段。此外,如果_name 字段尚未设置,则获取访问器将返回默认值。

使用属性

[编辑 | 编辑源代码]

客户端可以使用属性,就像使用简单的类字段一样

Customer customer = new Customer();

// this will not set the data.
customer.Name = "";

// since the field is not yet set, this will print out: "John Doe"
System.Console.WriteLine(customer.Name);

customer.Name = "Marissa";
System.Console.WriteLine(customer.Name);

上面的代码打印以下内容

John Doe
Marissa

访问级别

[编辑 | 编辑源代码]

C# 提供的各种访问级别,从最公开到最不公开

访问级别 使用限制
public 无。
internal 包含的程序集。
protected internal 包含的程序集或从包含类派生的类型。
protected 包含的类或从中派生的类型。
private 包含的类型。

如果未指定访问级别,则使用默认级别。它们是

类型 默认访问级别
namespace public(也是唯一允许的)
enum public
class private
interface public
struct private
(其他) internal

注意:命名空间级别元素(例如直接在命名空间下声明的类)不能声明为比 internal 更严格的级别。

华夏公益教科书