深入理解C#特性:從應用到自定義

——解鎖元數據標記的高級玩法


💡 核心認知:特性本質揭秘

public sealed class ReviewCommentAttribute : System.Attribute { ... }
  • 特性即特殊類:所有自定義特性必須繼承 System.Attribute(基礎規則)
  • 命名規范:類名需以 Attribute后綴結尾(如 MyAttributeAttribute
  • 密封建議:強烈推薦聲明為 sealed 類(防止意外繼承)

?? 特性構造三部曲

1?? 構造函數設計原則

public MyAttributeAttribute(string desc, string ver) 
{Description = desc;  // 位置參數 VersionNumber = ver;
}
  • 強制公有構造:至少需一個公共構造函數(隱式無參構造也可用)
  • 參數限制:僅接受編譯期常量(常量表達式)

2?? 應用時的構造規則

[MyAttribute("Holds a value")]          // 單參數構造
[MyAttribute("V1.3", Reviewer="Alice")] // 位置參數+命名參數
  • 位置參數優先:對應構造函數參數順序
  • 命名參數擴展:初始化公共字段/屬性(需在位置參數后)

3?? 無參構造的簡寫

[MyAttr]   // 等效于 [MyAttr()]
class MyClass 

🔐 精準控制特性作用域(AttributeUsage)

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, // 目標類型 Inherited = false,     // 禁止繼承 AllowMultiple = false  // 禁止重復應用
)]
public sealed class AuditAttribute : Attribute { ... }
參數作用默認值
ValidOn指定目標類型(枚舉按位組合)必填
Inherited是否被派生類繼承true
AllowMultiple同一目標是否允許多次應用false

常用目標類型(AttributeTargets枚舉):

  • Class | Method | Property
  • Field | Constructor | Assembly

? 自定義特性最佳實踐

1. 職責單一

特性類應僅描述目標結構的元數據狀態(如版本/作者/描述)

2. 安全封裝

// ? 正確示范 
public string Version { get; } // 只讀屬性// ? 避免 
public void Validate() { ... } // 禁止添加方法

3. 參數設計規范

  • 必需參數 → 通過構造函數位置參數傳遞
  • 可選參數 → 通過公共字段/屬性+命名參數設置

4. 完整聲明示例

[AttributeUsage(AttributeTargets.Class)]
public sealed class ApiVersionAttribute : Attribute
{public string Version { get; }public string Author { get; set; }  // 可選命名參數public ApiVersionAttribute(string version) => Version = version;
}// 應用示例 
[ApiVersion("2.1.0", Author = "Jane")]
public class PaymentService { ... }

💎 關鍵要點回顧

概念要點說明
特性本質繼承System.Attribute的特殊類
構造函數支持重載,參數需為編譯期常量
參數傳遞位置參數必填在前,命名參數補充在后
作用域控制AttributeUsage精確限制目標類型
安全實踐密封類 + 只包含字段/屬性 + 顯式目標聲明

特性如代碼的“智能標簽”
它不改變邏輯,卻為程序注入結構化元數據。掌握自定義特性,等于擁有為代碼打上語義化標記的能力,讓架構意圖更清晰,讓擴展更優雅。


📚 進階提示:特性需通過反射讀取(如GetCustomAttributes()),后續可探索特性與AOP編程、編譯時分析的深度結合!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93400.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習-集成學習(EnsembleLearning)

0 結果展示 0.1 鳶尾花分類 import pandas as pd import numpy as npfrom sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, recall_score, f1_score, classification_repo…

Golang database/sql 包深度解析(一)

database/sql 是 Go 語言標準庫中用于與 SQL(或類 SQL)數據庫交互的核心包,提供了一套輕量級、通用的接口,使得開發者可以用統一的方式操作各種不同的數據庫,而無需關心底層數據庫驅動的具體實現。 核心設計理念 datab…

文章自然潤色 API 數據接口

文章自然潤色 API 數據接口 ai / 文本處理 基于 AI 的文章潤色 專有模型 / 智能糾錯。 1. 產品功能 基于自有專業模型進行 AI 智能潤色對原始內容進行智能糾錯高效的文本潤色性能全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 / v1.3);全面兼容…

【狀壓DP】3276. 選擇矩陣中單元格的最大得分|2403

本文涉及知識點 C動態規劃 3276. 選擇矩陣中單元格的最大得分 給你一個由正整數構成的二維矩陣 grid。 你需要從矩陣中選擇 一個或多個 單元格,選中的單元格應滿足以下條件: 所選單元格中的任意兩個單元格都不會處于矩陣的 同一行。 所選單元格的值 互…

IDEA 清除 ctrl+shift+r 全局搜索記錄

定位文件:在Windows系統中,文件通常位于C:Users/用戶名/AppData/Roaming/JetBrains/IntelliJIdea(idea版本)/workspace目錄下,文件名為一小串隨機字符;在Mac系統中,文件位于/Users/用戶名/Library/Application /Suppor…

解鎖AI大模型:Prompt工程全面解析

解鎖AI大模型&#xff1a;Prompt工程全面解析 本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型開發 學習視頻/籽料/面試題 都在這>>Github<< 從新手到高手&#xff0c;Prompt 工程究竟是什么&#xff1f; 在當今數字化時代&#xff0c;AI …

HTTP0.9/1.0/1.1/2.0

在HTTP0.9中&#xff0c;只有GET方法&#xff0c;沒有請求頭headers&#xff0c;沒有狀態碼&#xff0c;只能用于傳輸HTML文件。到了HTTP1.0(1996)&#xff0c;HTTP1.0傳輸請求頭&#xff0c;有狀態碼&#xff0c;并且新增了POST和HEAD方法。HTTP1.0中&#xff0c;使用短連接&a…

gitee 流水線+docker-compose部署 nodejs服務+mysql+redis

文章中的方法是自己琢磨出來的&#xff0c;或許有更優解&#xff0c;共同學習&#xff0c;共同進步&#xff01; docker-compose.yml 文件配置&#xff1a; 說明&#xff1a;【配置中有個別字段冗余&#xff0c;但不影響使用】該文件推薦放在nodejs項目的根目錄中&#xff0c…

【算法】模擬專題

什么是模擬&#xff1f; 是一種通過模仿現實世界或問題場景的運行過程來求解問題的算法思想。它不依賴復雜的數學推導或邏輯優化&#xff0c;而是按照問題的實際規則、步驟或流程&#xff0c;一步步地 “復現” 過程&#xff0c;最終得到結果。 使用場景&#xff1a;當問題的邏…

【FreeRTOS】刨根問底6: 應該如何防止任務棧溢出?

【加關注&#xff0c;不迷路】一、棧溢出&#xff1a;程序世界的“越界洪水”就象一個裝水的玻璃杯&#xff08;棧空間&#xff09;&#xff0c;每次調用函數就像向水杯中倒水&#xff08;壓入保護需要恢復的數據&#xff09;。當函數嵌套調用過深&#xff08;如遞歸失控&#…

牛客周賽 Round 105

A.小苯的xor構造題目描述小紅喜歡整數 k&#xff0c;他想讓小苯構造兩個不相等的非負整數&#xff0c;使得兩數的異或和等于 k。請你幫幫小苯。#include <bits/stdc.h> using namespace std; using ll long long; void solve() {int k;cin>>k;cout<<0<&l…

《R for Data Science (2e)》免費中文翻譯 (第4章) --- Workflow: code style

寫在前面 本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn …

11-verilog的RTC驅動代碼

verilog的RTC驅動代碼 1.例化parameter SLAVE_ADDR 7h51 ; // 器件地址 parameter BIT_CTRL 1b0 ; // 字地址位控制參數(16b/8b) parameter CLK_FREQ 26d50_000_000; // i2c_dri模塊的驅動時鐘頻率(CLK_FREQ) parameter I2C_FR…

【k8s、docker】Headless Service(無頭服務)

文章目錄問題背景1、什么是Headless Service1.2 為什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行為1.3 驗證示例1.4 如何創建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何創建出來的&#xff1f;…

scikit-learn/sklearn學習|套索回歸Lasso解讀

【1】引言 前序學習進程中&#xff0c;對用scikit-learn表達線性回歸進行了初步解讀。 線性回歸能夠將因變量yyy表達成由自變量xxx、線性系數矩陣www和截距bbb組成的線性函數式&#xff1a; y∑i1nwi?xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n?wi??xi?bwTxb實…

暴雨服務器:以定制化滿足算力需求多樣化

在數字經濟與實體經濟深度融合的浪潮下&#xff0c;互聯網行業正經歷著前所未有的技術變革。大數據分析、云計算服務、人工智能算法等技術的快速演進&#xff0c;推動著企業對于高性能計算基礎設施的需求呈現指數級增長。據IDC數據顯示&#xff0c;互聯網行業已成為全球服務器采…

JavaScript字符串詳解

創建字符串&#xff1a; 1.使用字面量(推薦)&#xff1a; 這是最常用、最直接的方式。你可以用單引號 ()、雙引號 (") 或反引號 () 把文本包起來 let singleQuote 單引號; let doubleQuote "雙引號"; let templateLiteral 反引號;2.使用String 構造函數&…

Kiro Preview 應用評測

Kiro應用評測 Kiro 是一個由亞馬遜推出的 AI 驅動的智能開發環境&#xff0c;從原型到生產全程陪伴您的開發過程。它將"靈感編程"的流暢性與規范的清晰性相結合&#xff0c;幫助您更快地構建更好的軟件。 昨天收到了Kiro的試用郵件&#xff0c;收到郵件后第一時間下載…

Flink2.0學習筆記:Flink服務器搭建與flink作業提交

一&#xff0c;下載flink:Downloads | Apache Flink,解壓后放入IDE工作目錄&#xff1a;我這里以1.17版本為例 可以看到&#xff0c;flink后期的版本中沒有提供window啟動腳本:start-cluster.bat 所以這里要通過windows自帶的wsl 系統啟動它 打開終端依次運行下列命令完成w…

MySQL鎖的分類

MySQL鎖可以按照多個維度進行分類&#xff0c;下面我用最清晰的方式為你梳理所有分類方式&#xff1a;一、按鎖的粒度分類&#xff08;最常用分類&#xff09;鎖類型作用范圍特點適用引擎示例場景表級鎖整張表開銷小、加鎖快&#xff0c;并發度低MyISAM, MEMORY數據遷移、全表統…