属性概述

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

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

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

  • 专用数据成员的定义。

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

    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 这个术语是属性定义语法中的一个关键字。 在调用代码中,将变量 value 分配给属性。 value 的类型必须同它被分配到的属性的声明类型相同。

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

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

下面的示例在类 SimpleProperty 中定义了一个名为 MyNumber 的属性,并从类 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 方法和其他方法没有什么不同。 它们可以执行任何程序逻辑、引发异常、被重写以及用编程语言允许的任意修饰符进行声明。 但是请注意,属性也可以是静态的。 如果属性是静态的,则在 getset 方法可以实现的功能上有一些限制。 有关详细信息,请参见编程语言参考。

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

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

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

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

请参见

概念

组件的设计时特性)