C# 属性 (Get 和 Set)

属性和封装

在我们开始解释属性之前,您应该对封装"Encapsulation"有一个基本的了解。

封装的意义是确保对用户隐藏敏感数据。为此您必须:

  • 将字段/变量声明为私有 private
  • 通过属性提供公共字段public的值,通过getset方法来访问和更新私有字段private

属性

您从上一章了解到,private私有变量只能在同一个类中访问(外部类不能访问它)。但是,有时我们需要访问它们,这可以通过属性来完成。

属性类似于变量和方法的组合,它有两种方法:getset方法:

实例

class Person
{
  private string name; // 字段

  public string Name   // 属性
  {
    get { return name; }   // get 方法
    set { name = value; }  // set 方法
  }
}

实例解析

Name属性与name字段相关联。好的做法是对属性和私有字段使用相同的名称,但首字母大写。

get 方法返回变量名name的值。

set 方法为name变量赋值。value关键字表示我们分配给属性的值。

如果你不完全理解,请看下面的例子。

现在我们可以使用Name属性来访问和更新Person类的private字段:

实例

class Person
{
  private string name; // 方法
  public string Name   // 属性
  {
    get { return name; }
    set { name = value; }
  }
}

class Program
{
  static void Main(string[] args)
  {
    Person myObj = new Person();
    myObj.Name = "Liam";
    Console.WriteLine(myObj.Name);
  }
}

输出为:

Liam

运行实例 »


自动属性(简写)

C#还提供了一种使用简写/自动属性的方法,您不必为属性定义字段,只需在属性内部编写 get;set;

下面的示例将产生与上面示例相同的结果。唯一的区别是代码更少:

实例

Using automatic properties:

class Person
{
  public string Name  // property
  { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    Person myObj = new Person();
    myObj.Name = "Liam";
    Console.WriteLine(myObj.Name);
  }
}

输出将是:

Liam

运行实例 »


为什么要用封装?

  • 更好地控制类成员(减少自己(或他人)弄乱代码的可能性)
  • 字段可以设置为只读(如果只使用get方法),也可以设置为只读(如果只使用set方法)
  • 灵活:程序员可以更改代码的一部分而不影响其他部分
  • 提高了数据的安全性