{"id":1318,"date":"2023-03-31T21:29:23","date_gmt":"2023-03-31T14:29:23","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=1318"},"modified":"2023-04-01T18:50:46","modified_gmt":"2023-04-01T11:50:46","slug":"csharp-attributes","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-attributes\/","title":{"rendered":"C# Attributes"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to C# attributes to add metadata to your code and how to write a custom attribute.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to C# attributes<\/h2>\n\n\n\n<p>In C#, an attribute is a declarative tag that you can apply to <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-class\/\" target=\"_blank\" rel=\"noreferrer noopener\">classes<\/a>, methods, <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-property\/\">properties<\/a>, and other code elements.<\/p>\n\n\n\n<p>An attribute provides additional information about the code element to which it is applied. For example, you can use an attribute to indicate how an object should be serialized.<\/p>\n\n\n\n<p>All attributes class inherits from the <code>System.Attribute<\/code> class. Besides providing built-in attributes, you can create custom attribute classes that extend the <code>System.Attribute<\/code> class. <\/p>\n\n\n\n<p>The following example demonstrates how to use a built-in <code>Serializable<\/code> attribute for the <code>Person<\/code> class. The <code>Serializable<\/code> attribute instructs .NET that the <code>Person<\/code> class can be serialized into a binary format:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">&#91;<span class=\"hljs-meta\">Serializable<\/span>]\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Name { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">sbyte<\/span>? Age {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Why do you need C# attributes?<\/h2>\n\n\n\n<p>Attributes add metadata to your code so that .NET or other tools can use it at run time. For example, Visual Studio IDE uses attributes to provide IntelliSense and code completion suggestions. Also, the .NET runtime uses attributes to determine how to execute your code.<\/p>\n\n\n\n<p>Attributes can also be useful for enforcing coding conventions. For example, you can use the <code>Obsolete<\/code> attribute to mark a method of a class obsolete. Then, Visual Studio can give a warning if you attempt to call the obsolete method.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a custom attribute<\/h2>\n\n\n\n<p>The following program demonstrates how to create a custom attribute called <code>Author<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">&#91;<span class=\"hljs-meta\">AttributeUsage(AttributeTargets.Class)<\/span>]\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Author<\/span> : <span class=\"hljs-title\">Attribute<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Name\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Author<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> name<\/span>)<\/span>\n    {\n        Name = name;\n    }\n}\n\n&#91;<span class=\"hljs-meta\">Author(<span class=\"hljs-meta-string\">\"John Doe\"<\/span>)<\/span>]\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span>\n{\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ get all custom attributes of the Person class<\/span>\n        <span class=\"hljs-keyword\">var<\/span> attributes = Attribute.GetCustomAttributes(<span class=\"hljs-keyword\">typeof<\/span>(Person));\n\n        <span class=\"hljs-comment\">\/\/ Retrieve the author attribute<\/span>\n        <span class=\"hljs-keyword\">var<\/span> author = attributes.OfType&lt;Author&gt;().Single();\n        Console.WriteLine(author.Name);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">John Doe<\/code><\/span><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define a custom attribute class named <code>Author<\/code> that inherits from the  <code>Attribute<\/code>  class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">&#91;<span class=\"hljs-meta\">AttributeUsage(AttributeTargets.Class)<\/span>]\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Author<\/span> : <span class=\"hljs-title\">Attribute<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Name\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">Author<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> name<\/span>)<\/span>\n    {\n        Name = name;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Author<\/code> class has a <code>Name<\/code> property and a constructor that takes a <code>name<\/code> parameter. <\/p>\n\n\n\n<p>Also, we decorate the <code>Author<\/code> class with the <code>[AttributeUsage(AttributeTargets.Class)]<\/code> attribute, which specifies that the Author attribute can only be applied to classes.<\/p>\n\n\n\n<p>Second, define a <code>Person<\/code> class and use the <code>Author<\/code> attribute to decorate it:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">&#91;<span class=\"hljs-meta\">Author(<span class=\"hljs-meta-string\">\"John Doe\"<\/span>)<\/span>]\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Person<\/span>\n{\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>Author<\/code> attribute, we set the <code>Name<\/code> property to <code>\"John Doe\"<\/code>. Later, you can retrieve this information at runtime.<\/p>\n\n\n\n<p>Third, show the <code>Name<\/code> property of the <code>Author<\/code> attribute applied to the <code>Person<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ Get all custom attributes of the Person class<\/span>\n<span class=\"hljs-keyword\">var<\/span> attributes = Attribute.GetCustomAttributes(<span class=\"hljs-keyword\">typeof<\/span>(Person));\n\n<span class=\"hljs-comment\">\/\/ Retrieve the author attribute<\/span>\n<span class=\"hljs-keyword\">var<\/span> author = attributes.OfType&lt;Author&gt;().Single();\nConsole.WriteLine(author.Name);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>Main()<\/code> method, we use the <code>Attribute.GetCustomAttributes<\/code> method to retrieve all custom attributes of the <code>Person<\/code> class. <\/p>\n\n\n\n<p>Then, we use the <code>OfType<\/code> <a href=\"https:\/\/csharptutorial.net\/csharp-linq\/\" target=\"_blank\" rel=\"noreferrer noopener\">LINQ<\/a> extension method to filter the list of attributes to get the one with the type <code>Author<\/code>. <\/p>\n\n\n\n<p>Since the <code>Person<\/code> class has only one <code>Author<\/code> attribute, we use the <code><a href=\"https:\/\/csharptutorial.net\/csharp-linq\/linq-single\/\">Single<\/a><\/code> method to retrieve it and display its <code>Name<\/code> property to the console.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Attributes are declarative tags that you can apply to classes, methods, and properties.<\/li>\n\n\n\n<li>Attributes provide additional information to the code elements that it applies to.<\/li>\n\n\n\n<li>Attributes use <code>System.Attribute<\/code> as the base class.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1318\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-attributes\/\"\n\t\t\t\tdata-post-title=\"C# Attributes\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1318\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-tutorial\/csharp-attributes\/\"\n\t\t\t\tdata-post-title=\"C# Attributes\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn how to C# attributes to add metadata to your code and how to write a custom attribute.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":7,"menu_order":76,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1318","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1318","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=1318"}],"version-history":[{"count":3,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1318\/revisions"}],"predecessor-version":[{"id":1333,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1318\/revisions\/1333"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/7"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=1318"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}