常用特性(C# 和 Visual Basic)

本主题介绍最常用于在 C# 和 Visual Basic 程序中的属性。

  • 全局属性

  • 已过时的特性

  • 条件特性

  • 调用方信息属性

  • Visual Basic 特性

全局属性

大多数特性适用于特定的语言元素 (如类或方法;但是,有些属性是全局它们适用于整个程序集或模块。 例如, AssemblyVersionAttribute 属性可用于向程序集中嵌入版本信息,如下例所示:

[assembly: AssemblyVersion("1.0.0.0")]
<Assembly: AssemblyVersion("1.0.0.0")>

全局特性在源代码中出现在任何顶级 using 指令 (在 Visual Basic 中Imports 更高版本以及任何类型、模块或命名空间声明之前。 全局特性可显示在多个源文件,但是,在单一编译传递必须编译文件。 对于 Visual Basic 项目,全局属性以 Visual Basic 项目自动创建的 AssemblyInfo.vb 文件通常中。 在 C# 项目中,它们在 AssemblyInfo.cs 文件中。

程序集特性是提供有关程序集的信息的值。 它们分成以下类别:

  • 程序集标识特性

  • 信息性特性

  • 程序集清单特性

  • 强名称特性

程序集标识特性

三个特性 (使用强名称,如果适用) 确定程序集的标识:名称、版本和区域性。 ,当在代码中引用时,这些特性构成程序集的完整名称需要。 使用特性,可以将程序集的版本和区域性。 但是,名称值由编译器,在 “程序集信息”对话框或程序集链接器 (al.exe) 的 Visual Studio IDE 设置,创建程序集后,根据包含程序集清单的文件。 AssemblyFlagsAttribute 特性指定程序集的多个副本是否可以共存。

下表显示标识属性。

特性

用途

AssemblyName

详细描述程序集的标识。

AssemblyVersionAttribute

指定程序集的版本。

AssemblyCultureAttribute

指定程序集支持哪个区域性

AssemblyFlagsAttribute

在同一在同一应用程序域指定程序集是否支持在同一台计算机上并行执行,处理,或者。

信息性特性

您可以使用信息性特性为程序集提供其他的公司或产品信息。 下表显示在 System.Reflection 命名空间中定义的信息性特性。

特性

用途

AssemblyProductAttribute

定义为程序集清单指定产品名称的自定义特性。

AssemblyTrademarkAttribute

定义为程序集清单指定商标的自定义特性。

AssemblyInformationalVersionAttribute

定义为程序集清单指定信息性版本的自定义特性。

AssemblyCompanyAttribute

定义为程序集清单指定公司名称的自定义特性。

AssemblyCopyrightAttribute

定义为程序集清单指定版权的自定义特性。

AssemblyFileVersionAttribute

指示编译器使用 Win32 文件版本资源的特定版本号。

CLSCompliantAttribute

指示程序集是否符合公共语言规范 (CLS) (cls)。

程序集清单特性

可以使用程序集清单特性提供程序集清单中的信息。 其中包括标题、说明、默认别名和配置。 下表显示在 System.Reflection 命名空间中定义的程序集清单特性。

特性

用途

AssemblyTitleAttribute

定义为程序集清单指定程序集标题的自定义特性。

AssemblyDescriptionAttribute

定义为程序集清单指定程序集说明的自定义特性。

AssemblyConfigurationAttribute

定义用于指定程序集配置的自定义特性 (例如 retail 或调试) 为程序集清单。

AssemblyDefaultAliasAttribute

程序集清单定义友好默认别名

强名称特性

在 Visual Studio 的早期版本,若要使用强名称的程序集执行以下程序集级别特性:

这仍支持,但是,给程序集签名的首选方法是使用 签名页 在 " 项目设计器 " 请参见 “项目设计器”->“签名”页如何:对程序集进行签名 (Visual Studio) 有关更多信息。

已过时的特性

Obsolete 属性指示某个程序实体标记为建议不再使用的一个。 每次使用对实体标记为过时根据随后将生成警告或错误,配置属性。 例如:

    <System.Obsolete("use class B")> 
    Class A
        Sub Method()
        End Sub 
    End Class 

    Class B
        <System.Obsolete("use NewMethod", True)> 
        Sub OldMethod()
        End Sub 

        Sub NewMethod()
        End Sub 
    End Class
[System.Obsolete("use class B")]
class A
{
    public void Method() { }
}
class B
{
    [System.Obsolete("use NewMethod", true)]
    public void OldMethod() { }
    public void NewMethod() { }
}

在此示例中应用 Obsolete 特性类 A 和给方法 B.OldMethod。 由于特性构造函数的第二个参数被应用于 B.OldMethod 设置为 true,此方法将导致编译器错误,,而使用 A 都将生成警告的类。 调用 B.NewMethod,但是,不会导致警告或错误。

为警告或错误的一部分,作为第一个参数提供的字符串给特性构造函数将显示。 例如,在中,当将它与前面的定义时,以下代码生成两个警告和一个错误:

' Generates 2 warnings: 
' Dim a As New A 
' Generate no errors or warnings: 

Dim b As New B
b.NewMethod()

' Generates an error, terminating compilation: 
' b.OldMethod()
// Generates 2 warnings: 
// A a = new A(); 

// Generate no errors or warnings:
B b = new B();
b.NewMethod();

// Generates an error, terminating compilation: 
// b.OldMethod();

类的 A 两个将生成警告:一个用于声明类的引用和一个用于类构造函数。

Obsolete 属性,即可在不使用参数,但是,包括原因已过时,并什么项的建议。

Obsolete 属性是一种单用途特性,并且可应用于允许特性的任何实体。 Obsolete 是 ObsoleteAttribute的别名。

条件特性

Conditional 属性执行方法依赖于预处理标识符。 Conditional 属性是 ConditionalAttribute的别名,可应用于方法或属性类。

在此示例中, Conditional 应用于方法以启用或禁用程序特定诊断信息示:

#Const TRACE_ON = True 
Imports System
Imports System.Diagnostics
Module TestConditionalAttribute
    Public Class Trace
        <Conditional("TRACE_ON")> 
        Public Shared Sub Msg(ByVal msg As String)
            Console.WriteLine(msg)
        End Sub 

    End Class 

    Sub Main()
        Trace.Msg("Now in Main...")
        Console.WriteLine("Done.")
    End Sub 
End Module
#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class ProgramClass
{
    static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}

如果 TRACE_ON 未定义标识符,则将不会显示跟踪输出。

Conditional 属性通常用于在 DEBUG 标识符启用跟踪,并记录的功能的调试版本,但不在发布版本中,如下所示:

<Conditional("DEBUG")> 
Shared Sub DebugMethod()

End Sub
[Conditional("DEBUG")]
static void DebugMethod()
{
}

当为条件标记为的调用方法时,是否存在指定的预处理符号确定调用是否包括或省略。 如果定义了该符号,则包含调用;否则,调用中被省略。 使用 Conditional 是更加整洁,较细,,并且不太到将方法的容易出错的除了在 #if…#endif 内部块标明,例如:

#If DEBUG Then 
    Sub ConditionalMethod()
    End Sub
#End If
#if DEBUG
    void ConditionalMethod()
    {
    }
#endif

一个条件方法必须是类或结构声明的方法,而且不能有返回值。

使用多个标识符

如果方法具有多个 Conditional 属性,对方法的调用包括在内,如果至少一个条件符号的定义 (换言之,这些符号在逻辑上链接可以使用或运算符)。 在此示例中, A 或 B 显示导致方法调用:

<Conditional("A"), Conditional("B")> 
Shared Sub DoIfAorB()

End Sub
[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}

通过使用和运算符,若要实现逻辑链接符号的效果,可以定义序列化的条件方法。 例如,因此,只有当 A 和 B 定义,下面的第二种方法将执行:

<Conditional("A")> 
Shared Sub DoIfA()
    DoIfAandB()
End Sub

<Conditional("B")> 
Shared Sub DoIfAandB()
    ' Code to execute when both A and B are defined... 
End Sub
[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}

[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}

使用具有特性类的条件

Conditional 还可将特性应用于特性类定义。 在此示例中,因此,如果定义了 DEBUG 时,自定义属性 Documentation 只将信息添加到元数据。

<Conditional("DEBUG")> 
Public Class Documentation
    Inherits System.Attribute
    Private text As String 
    Sub New(ByVal doc_text As String)
        text = doc_text
    End Sub 
End Class 

Class SampleClass
    ' This attribute will only be included if DEBUG is defined.
    <Documentation("This method displays an integer.")> 
    Shared Sub DoWork(ByVal i As Integer)
        System.Console.WriteLine(i)
    End Sub 
End Class
[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
    string text;

    public Documentation(string text)
    {
        this.text = text;
    }
}

class SampleClass
{
    // This attribute will only be included if DEBUG is defined.
    [Documentation("This method displays an integer.")]
    static void DoWork(int i)
    {
        System.Console.WriteLine(i.ToString());
    }
}

调用方信息属性

使用调用方信息属性,可以获取关于调用方的信息传递给方法。 可以获取源代码、行号在源代码和调用方的成员名称的文件路径。

若要获取成员调用方信息,请使用适用于可选参数的属性。 每个可选参数指定默认值。 下表列出了 System.Runtime.CompilerServices 命名空间中定义的调用方信息属性:

特性

说明

类型

CallerFilePathAttribute

包含调用方源文件的完整路径。 这是路径在编译时。

String

CallerLineNumberAttribute

在调用方法的源文件中的行号。

Integer

CallerMemberNameAttribute

方法名称或调用方的属性名称。 有关更多信息,请参见 调用方信息(C# 和 Visual Basic)

String

有关调用方信息属性的更多信息,请 调用方信息(C# 和 Visual Basic)参见。

Visual Basic 特性

下表列出了特定于 Visual Basic 的属性。

特性

用途

ComClassAttribute

指示编译器应显示类作为 COM 对象。

HideModuleNameAttribute

允许访问模块成员。只使用模块需要的该限定。

VBFixedStringAttribute

在结构指定固定长度字符串的大小。与文件的使用输入和输出函数。

VBFixedArrayAttribute

在结构指定一个固定数组的大小为与文件的使用输入和输出函数。

COMClassAttribute

使用 COMClassAttribute 简化创建从 Visual Basic的 COM 组件。 COM 对象是大量使用 .NET Framework 程序集不同,因此,,而无需 COMClassAttribute,您需要经过很多步骤会从 Visual Basic的 COM 对象。 对于标记为的类 COMClassAttribute,编译器会自动执行这些步骤中的许多

HideModuleNameAttribute

使用 HideModuleNameAttribute 允许访问模块成员。通过只使用模块需要的该限定。

VBFixedStringAttribute

使用 VBFixedStringAttribute 强制 Visual Basic 创建定长字符串。 字符串的长度在默认情况下是可变的,因此,此属性很有用,在将字符串存储到文件中。 下面的代码对此进行了说明:

Structure Worker
    ' The runtime uses VBFixedString to determine  
    ' if the field should be written out as a fixed size.
    <VBFixedString(10)> Public LastName As String
    <VBFixedString(7)> Public Title As String
    <VBFixedString(2)> Public Rank As String 
End Structure

VBFixedArrayAttribute

使用 VBFixedArrayAttribute 声明固定大小的数组。 默认情况下与 Visual Basic 字符串,数组是可变的。 ,在序列化数据或将到文件时,此属性很有用。

请参见

参考

反射(C# 和 Visual Basic)

使用反射访问特性(C# 和 Visual Basic)

System.Reflection

Attribute

概念

C# 编程指南

其他资源

Visual Basic 编程指南

利用特性扩展元数据