C# 编程/封装2
外观
< C# 编程
一位维基教科书用户建议将这本书或章节合并到C# 编程/封装。 请在讨论页面上讨论是否应该进行合并。 |
属性封装了对对象状态的控制。
例如,以下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
属性包含三个重要部分:声明、设置访问器和获取访问器。
访问修饰符决定了谁可以操作这些数据。属性可以被限定为public、private、protected 或 internal。
类型决定了它可以接受或返回的类型。
属性名称声明了用于访问属性的名称。
使用设置访问器设置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 更严格的级别。