C#中属性GeneratedCodeAttribute的效用是什么?

时间:2010-03-05 16:13:24

标签: c# attributes code-generation

我使用外部工具生成了一些C#代码。每个生成的类都有一个属性GeneratedCodeAttribute。为什么我的生成器会创建此属性?

5 个答案:

答案 0 :(得分:13)

此属性已设置,因为此代码是由工具生成的,而不是由人类生成的:)您可能会问它的用途是什么? MSDN告诉我们:

  

GeneratedCodeAttribute类可以   由代码分析工具使用   识别计算机生成的代码,和   提供基于的分析   工具和工具的版本   生成了代码。

答案 1 :(得分:6)

第一个链接是它的文档,第二个链接是对它的详细描述,代码生成器为什么产生它,以及代码分析器如何使用它。

http://msdn.microsoft.com/en-us/library/system.codedom.compiler.generatedcodeattribute.aspx

https://blogs.msdn.microsoft.com/codeanalysis/2007/04/27/correct-usage-of-the-compilergeneratedattribute-and-the-generatedcodeattribute/

这会回答你的问题吗?

答案 2 :(得分:1)

发生器最有可能使用它来找回它创建的元素,以便执行更新。请注意,如果您修改生成的代码:根据工具行为,您可能会在进一步更新时失去修改。

答案 3 :(得分:1)

一个潜在用途是某些覆盖工具可以根据指定的属性跳过代码。您可以告诉NCover忽略具有此属性的代码。

答案 4 :(得分:-1)

这是Microsoft博客文章Correct usage of the CompilerGeneratedAttribute and the GeneratedCodeAttribute中的相关文本,以防最终从他们的站点中消失(这很常见)。


正确使用CompilerGeneratedAttribute和GeneratedCodeAttribute

2007年4月27日

代码分析,FxCop和代码度量标准都广泛使用CompilerGeneratedAttribute和GeneratedCodeAttribute来区分用户编写的代码和工具以及编译器生成的代码。

以下描述了此行为:

Visual Studio 2005和FxCop 1.35中的代码分析

  • 工具已生成。针对几乎所有工具生成的代码发出警告。使用算法来关闭针对标有GeneratedCodeAttribute并由特定代码生成器生成的代码的特定规则。

Visual Studio 2008和FxCop 1.36中的代码分析

  • 工具已生成。如果启用了根据生成的代码禁止显示结果(默认设置),则不会针对标有GeneratedCodeAttribute的代码发出警告。

Visual Studio 2008中的代码指标

  • 工具已生成。不显示或生成标记为GeneratedCodeAttribute的代码的指标。

不幸的是,在Microsoft内部和外部都有许多不正确使用这些属性的情况,这篇博客文章试图使正确使用这些属性的事情变得更加清晰。

...

GeneratedCodeAttribute

此属性供生成代码的自定义工具使用。它仅应应用于一遍又一遍地重新生成的代码,并且不应被期望用户修改的模板所使用。如果所生成的类型是部分类,则也不应在类型级别应用它。在这种情况下,应仅将其应用于类型的生成部分中包含的单个成员。

例如,以下内容显示了此属性的不正确用法(在类型级别将其应用于部分类):

[GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0" )]
internal sealed partial class Settings : ApplicationSettingsBase
{
    private static Settings defaultInstance = ((Settings)(ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default
    {
        get { return defaultInstance; }
    }
    
    [UserScopedSettingAttribute()]
    [DebuggerNonUserCodeAttribute()]
    [DefaultSettingValueAttribute("")]
    public string MySetting
    {
        get { return ((string)(this["MySetting"])); }
        set { this["MySetting"] = value; }
    }

}

以下显示了此属性的正确用法:

internal sealed partial class Settings : ApplicationSettingsBase
{
    [GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0" )]
    private static Settings defaultInstance = ((Settings)(ApplicationSettingsBase.Synchronized(new Settings())));
    
    [GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
    public static Settings Default
    {
    get { return defaultInstance; }
    }
    
    [GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
    [UserScopedSettingAttribute()]
    [DebuggerNonUserCodeAttribute()]
    [DefaultSettingValueAttribute("")]
    public string MySetting
    {
        get { return ((string)(this["MySetting"])); }
        set { this["MySetting"] = value; }
    }
}