属性概述

更新:2007 年 11 月

组件应该定义属性而不是公共字段,因为可视化设计器(如 Visual Studio)在属性浏览器中显示属性 (Property),而不显示字段。(在本主题的最后列出了定义属性 (Property) 的其他强制性的原因)。

属性 (Property) 就像智能字段。属性 (Property) 通常具有带访问函数的专用数据成员,在语法上属性 (Property) 被作为类的字段进行访问。(虽然属性 (Property) 可以具有不同的访问级别,但此处的讨论将重点放在公共访问这种更加常见的情况上。) 因为 Visual Basic 的许多版本中都可以使用属性 (Property),Visual Basic 程序员可以跳过本主题。

属性 (Property) 定义通常由以下两部分组成:

  • 专用数据成员的定义。

    private int number = 0;
    
    Private number As Integer = 0
    
  • 使用属性 (Property)声明语法对公共属性 (Property) 进行的定义。该语法通过 getset 访问函数将专用数据成员和公共属性 (Property) 关联起来。

    public int MyNumber 
    {
    // Retrieves the number data member.
    get 
       { 
          return number; 
       }
    // Assigns to the number data member.
    set 
       { 
          number = value;
       }
    }
    
    Public Property MyNumber As Integer
       ' Retrieves number.
       Get 
          Return number
       End Get
       ' Assigns to number.
       Set 
          number = value
       End Set
    End Property
    

value 这个术语是属性 (Property) 定义语法中的一个关键字。在调用代码中,将变量 value 分配给属性 (Property)。value 的类型必须同它被分配到的属性 (Property) 的声明类型相同。

虽然属性 (Property) 定义中通常包含专用数据成员,但这不是必需的。get 访问器不用访问私有数据成员就可以返回值。get 方法返回系统时间的属性 (Property) 就属于这种情况。属性 (Property) 启用数据隐藏,访问器方法隐藏属性 (Property) 的实现。

在不同的编程语言中,属性 (Property) 语法存在一些差异。例如,术语“property”(属性)不是 C# 中的关键字,但却是 Visual Basic 中的关键字。有关语言特定的信息,请参见有关该语言的文档。

下面的示例在类 SimpleProperty 中定义了一个名为 MyNumber 的属性 (Property),并从类 UsesSimpleProperty 访问 MyNumber。

public class SimpleProperty 
{
   private int number = 0;
   public int MyNumber 
   {
   // Retrieves the data member number.
   get 
      { 
         return number; 
      }
   // Assigns to the data member number.
   set 
      { 
         number = value;
      }
   } 
// Other members.
}
public class UsesSimpleProperty
{
   public static void Main()
   {
      SimpleProperty example = new SimpleProperty();
// Sets the property.
      example.MyNumber = 5;
// Gets the property.
      int anumber = example.MyNumber;
   }
}
Public Class SimpleProperty 
    Private number As Integer = 0

    Public Property MyNumber As Integer
        ' Retrieves number.
        Get 
            Return number
        End Get
        ' Assigns to number.
        Set 
            number = value
        End Set
    End Property    

' Other members...
End Class

Public Class UsesSimpleProperty
    Public Shared Sub Main()
        Dim example As New SimpleProperty()
        ' Sets the property.
        example.MyNumber = 5
        ' Gets the property.
        Dim anumber As Integer = example.MyNumber
    End Sub
End Class

一般说来,get 和 set 方法和其他方法没有什么不同。它们可以执行任何程序逻辑、引发异常、被重写以及用编程语言允许的任意修饰符进行声明。但是请注意,属性 (Property) 也可以是静态的。如果属性 (Property) 是静态的,则在 getset 方法可以实现的功能上有一些局限性。有关详细信息,请参见编程语言参考。

属性 (Property) 的类型可以是基元类型、基元类型的集合、用户定义类型或用户定义类型的集合。对于所有基元类型,.NET Framework 提供实现字符串到值转换的类型转换器。有关详细信息,请参见通用类型转换。当属性 (Property) 可以使用类型转换器时,它显示在设计器的属性 (Property) 浏览器中。如果您定义自定义属性 (Property) 并想让属性 (Property) 浏览器显示它们,则必须实现自定义类型转换器。

当属性 (Property) 的数据类型是枚举时,开发环境(例如 Microsoft Visual Studio)在“属性”窗口中将该属性显示为下拉列表。如果属性的数据类型是具有属性的类,这些属性 (Property) 叫做定义属性 (Property) 的子属性 (Property)。在 Visual Studio 的“属性”窗口中,用户可以展开属性以显示其子属性 (Property)。

向属性 (Property) 添加属性 (Attribute) 十分重要,这样它们可以在设计时正确地显示在属性 (Property) 浏览器中。有关详细信息,请参见组件的设计时属性

您应该公开组件的属性 (Property) 而不是公共字段,因为属性 (Property) 的版本可以控制,它们允许数据隐藏,并且访问器方法可以执行附加逻辑。通常,由于有实时优化,属性 (Property) 的开销并不比字段大。

请参见

概念

组件的设计时属性 (Attribute)