[C#] 剖析 AssemblyInfo.cs – 了解常用的特性 Attribute

[C#] 剖析 AssemblyInfo.cs – 了解常用的特性 Attribute剖析 AssemblyInfo.cs-了解常用的特性Attribute【博主】反骨仔【原文】http://www.cnblogs.com/liqingwen/p/5944391.h

大家好,又见面了,我是你们的朋友全栈君。

剖析 AssemblyInfo.cs – 了解常用的特性 Attribute

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/5944391.html

 

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

  

序

  之前,我们通过《C# 知识回顾 – 特性 Attribute》已经了解如何创建和使用特性 Attribute,这次,让我们一起来看看每次使用 VS 创建项目时所自带的文件 AssemblyInfo.cs。

 

目录

 

AssemblyInfo.cs

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

随机挑选一个 AssemblyInfo.cs 文件,展开图中的代码,看箭头↓

using System.Reflection;
using System.Runtime.InteropServices;

// 有关程序集的常规信息通过下列特性集
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("MusicStore")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("MusicStore")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 会使此程序集中的类型
// 对 COM 组件不可见。如果需要
// 从 COM 访问此程序集中的某个类型,请针对该类型将 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID
[assembly: Guid("a9ef3281-9049-4a52-a2f1-2061d442200e")]

// 程序集的版本信息由下列四个值组成:
//
//      主版本
//      次版本
//      内部版本号
//      修订版本
//
// 可以指定所有值,也可以使用“修订号”和“内部版本号”的默认值,
// 方法是按如下所示使用 "*":
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

 

一、全局特性

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

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

 

  全局特性在源代码中出现在任何顶级 using 指令以及任何类型、模块或命名空间声明之前。全局特性可显示在多个源文件,但是,在单一编译传递必须编译文件。在 C# 项目中,它们在 AssemblyInfo.cs 文件中。

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

    ①程序集标识特性

    ②信息性特性

    ③程序集清单特性

    ④强名称特性

  

  1.程序集标识特性

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

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

 

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

图 – “程序集信息”对话框

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

图 – “程序集信息”对话框中的名词和 AssemblyInfo.cs 文件的对应关系

 

  2.信息性特性

  您可以使用信息性特性为程序集提供其他的公司或产品信息。

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

 

  3.程序集清单特性

  可以使用程序集清单特性提供程序集清单中的信息。其中包括标题、说明、默认别名和配置。

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

 

  4.强名称特性(不深入)

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

    ①AssemblyKeyFileAttribute

    ②AssemblyKeyNameAttribute

    ③AssemblyDelaySignAttribute

  虽然现在仍支持,但是,给程序集签名的首选方法是使用“签名页”。(这里不深入了解)

 

二、已过时的特性:Obsolete

   
Obsolete 特性指示某个程序实体标记为建议不再使用的一个。 每次使用对实体标记为过时根据随后将生成警告或错误。
 1     /// <summary>
 2     /// 旧类
 3     /// </summary>
 4     [Obsolete("请使用 " + nameof(NewClass))]
 5     class OldClass
 6     {
 7         public void Method() { }
 8     }
 9 
10     /// <summary>
11     /// 新类
12     /// </summary>
13     class NewClass
14     {
15         [Obsolete("请使用 " + nameof(NewMethod), true)]
16         public void OldMethod() { }
17 
18         public void NewMethod() { }
19     }

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var oldClass = new OldClass();  //警告
 6 
 7             var newClass = new NewClass();
 8             newClass.OldMethod();  //报错
 9         }
10     }

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

  在此示例中应用 Obsolete 特性类 OldClass 和方法 NewClass.OldMethod。此构造函数的第一个参数为警告或错误的信息,由于特性构造函数的第二个参数被应用于 NewClass.OldMethod 设置为 true,此方法将导致编译器错误,而使用 OldClass 只将生成警告的类。

 

三、条件特性:Conditional

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

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

 1     class Debug
 2     {
 3         [Conditional("DEBUG")]
 4         public static void Output(string msg)
 5         {
 6             Console.WriteLine(msg);
 7         }
 8     }
 9 
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             Debug.Output("This is Debug!");
15             Console.WriteLine("Done!");
16 
17             Console.Read();
18         }
19     }

  Conditional 特性通常用于在 DEBUG 标识符启用跟踪,并记录的功能的调试版本,但不在发布版本中。

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

  

  将之前的代码简单改动下,使用 #if…#endif 包扎,结果和上图是一样的。

    class Debug
    {
        public static void Output(string msg)
        {
            Console.WriteLine(msg);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            #if DEBUG
            Debug.Output("This is Debug!");
            #endif

            Console.WriteLine("Done!");

            Console.Read();
        }
    }

  使用 Conditional 更加整洁,当然也可以将平常不太到用到或者容易出错的方法在 #if…#endif 内部块标明。

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

 

四、调用方信息特性

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

  若要获取成员调用方信息,请使用适用于可选参数的属性。每个可选参数指定默认值。

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

 

 1     internal class Program
 2     {
 3         private static void Main(string[] args)
 4         {
 5             CallerMethod();
 6             Console.Read();
 7         }
 8 
 9         public static void CallerMethod()
10         {
11             TraceMessage("我是调用者");
12         }
13 
14         public static void TraceMessage(string msg,
15             [CallerMemberName] string name = "",
16             [CallerFilePath] string filePath = "",
17             [CallerLineNumber] int lineNumer = 0)
18         {
19             Trace.WriteLine($"{nameof(msg)}: {msg}");
20             Trace.WriteLine($"{nameof(name)}: {name}");
21             Trace.WriteLine($"{nameof(filePath)}: {filePath}");
22             Trace.WriteLine($"{nameof(lineNumer)}: {lineNumer}");
23         }
24     }

<span role="heading" aria-level="2">[C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

  每次调用 CallerMethod 方法时,调用方信息将替换为可选参数的变量。

 

  1.备注

  你必须为每个可选参数指定显式默认值。不能将调用方信息特性应用于未指定为可选的参数。

  调用方信息特性不会使参数成为可选参数。相反,它们会在忽略此参数时影响传入的默认值。

  在编译时,调用方信息值将作为文本传入中间语言 (IL)。与异常的 StackTrace 特性的结果不同,这些结果不受模糊处理的影响。

  你可显式提供可选参数来控制调用方信息或隐藏调用方信息。

 

传送门

  《C# 知识回顾 – 特性 Attribute》

  《C# 知识回顾 – 序列化》

  《C# 知识回顾 – 表达式树 Expression Trees》

 

 



【参考】微软官方文档

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155328.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LeetCode[5]-最长回文子串_区间DP

    LeetCode[5]-最长回文子串_区间DP给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。示例 1:输入:s = “aab”输出:[[“a”,”a”,”b”],[“aa”,”b”]]示例 2:输入:s = “a”输出:[[“a”]] 提示:1 <= s.length <= 16s 仅由小写英文字母组成题解暴搜class Solution {public: vector<vector<st

    2022年8月9日
  • 元素守恒计算方法_树状数组求逆序对

    元素守恒计算方法_树状数组求逆序对给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。示例:输入:nums = [5,2,6,1]输出:[2,1,1,0] 解释:5 的右侧有 2 个更小的元素 (2 和 1)2 的右侧仅有 1 个更小的元素 (1)6 的右侧有 1 个更小的元素 (1)1 的右侧有 0 个更小的元素提示:0 <= nums.length <= 10^5-10^4

    2022年8月9日
  • mysql分页查询实例_mysql分页查询实例讲解「建议收藏」

    LIMIT子句可以被用于强制SELECT语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0(而不是1)。下面,我们针对特例对mysql分页查询进行总结。mysql提供分页的功能:SELECT*FROMtableLIMIT[offset…

    2022年4月11日
  • lua学习之table类型

    关系表类型,这是一个很强大的类型。我们可以把这个类型看作是一个数组。只是 C语言的数组,只能用正整数来作索引; 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是&#1

    2021年12月25日
  • 国内外6款优秀的免费CDN服务「建议收藏」

    国内外6款优秀的免费CDN服务「建议收藏」CDN是一种新型网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代表了一种基于质量与秩序的网络服务模式。之前有过几篇文章介绍了CDNZZ和Cloudflare,今天再来系统推荐一下几家比较有名的CDN,都是免费的,或者其免费服务已经够用了。CDN主要特点1、本地Cache加速 提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大

    2022年9月4日
  • QStringList 使用

    QStringList 使用创建QStringList获取QStringList里面的元素QStringListstrList=item.split(‘#’);QStringstr1=strList.at(0);QStringstr2=strList.at(1);

    2022年4月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号