效能規則

效能規則支援高效能程式庫與應用程式。

本節內容

規則 描述
CA1802: 在適當情況下使用常值 欄位宣告為靜態和唯讀的 (Visual Basic 中的 Shared 和 ReadOnly),並以編譯時期可計算的值初始化。 由於分配給目標欄位的值在編譯時可計算,請將宣告更改為 const(Visual Basic 中的 Const)欄位,使值在編譯時而非執行時計算。
CA1805:請勿進行非必要的初始化 .NET 運行時間在執行建構函式之前,先將參考型別的所有欄位初始化為其預設值。 在大部分案例下,明確地將欄位初始化為其預設值是不必要的,這會增加維護成本,而且可能會降低效能 (例如,組件大小增加)。
CA1806:不要忽略方法的結果 已建立新物件,但從未使用;或呼叫了會建立並傳回新字串的方法,但從未使用該新字串;或者元件物件模型 (COM) 或 P/Invoke 方法傳回了從未使用的 HRESULT 或錯誤碼。
CA1810:必須將參考類型內部的靜態欄位初始化 當類型宣告明確的靜態建構函式時,Just-In-Time (JIT) 編譯器會將檢查加入至類型的每個靜態方法和執行個體建構函式,確保之前已呼叫該靜態建構函式。 靜態建構函式檢查可能會導致效能下降。
CA1812:避免使用未執行個體化的內部類別 組件層級類型的執行個體不是由組件中的程式碼所建立。
CA1813:避免使用非密封屬性 .NET 提供擷取自定義屬性的方法。 根據預設,這些方法會搜尋屬性繼承階層架構。 密封屬性會減少對整個繼承階層架構的搜尋,並且可以改進效能。
CA1814:建議使用不規則陣列取代多維陣列 不規則陣列是一種陣列,其各元素皆為陣列。 組成元素的陣列大小可能不同,這可能會導致某些數據集的浪費空間較少。
CA1815: 覆寫值型別上的 Equals 方法和相等運算子 對於實值類型而言,Equals 的繼承實作會使用 Reflection 程式庫,並比較所有欄位的內容。 反射的計算成本很高,而且可能沒有必要逐一比較每個欄位是否相等。 如果希望使用者比較或排序執行個體,或是使用執行個體做為雜湊資料表索引鍵,則您的實值類型應實作 Equals。
CA1819:屬性不應該傳回陣列 即使屬性是唯讀的,由屬性傳回的陣列也不受寫入保護。 若要讓陣列防止遭到竄改,屬性必須傳回該陣列的複本。 一般而言,使用者不了解呼叫這類屬性所造成的不良效能影響。
CA1820: 使用字串長度來測試空字串 使用 String.Length 屬性或 String.IsNullOrEmpty 方法比較字串,明顯地會比使用 Equals 還快。
CA1821: 移除空的解構函式 只要可以,請避免使用終結器,因為追蹤物件生命週期會帶來額外的效能負擔。 空的 finalizer 會帶來額外負擔,卻沒有任何好處。
CA1822:將成員標記為 static 不會存取執行個體資料或呼叫執行個體方法的成員,可以標示為 static(在 Visual Basic 中為 Shared)。 將方法標記為 static 之後,編譯器將對這些成員發出非虛擬呼叫位置。 這麼做可以讓重視效能的程式碼獲得可觀的效能。
CA1823: 避免未使用的私用欄位 偵測到似乎不能在組件內存取的私用欄位。
CA1824: 使用 NeutralResourcesLanguageAttribute 標記組件 NeutralResourcesLanguage 屬性會通知資源管理員,用來顯示組件中性文化特性資源的是哪一種語言。 這可改善載入第一個資源的查詢效能,而且可以減少您的工作集。
CA1825:請避免長度為零的陣列配置 初始化長度為零的陣列會導致不必要的記憶體配置。 請改為呼叫 Array.Empty,使用以靜態方式配置的空陣列執行個體。 此方法的所有呼叫會共用同一記憶體配置。
CA1826:請使用屬性,不要使用 Linq Enumerable 方法 Enumerable LINQ 方法用於支援對等、更有效率屬性的型別。
CA1827:當可使用 Any 時,請勿使用 Count/LongCount CountLongCount 方法用於 Any 方法效率更高的地方。
CA1828:不要在可使用 AnyAsync 時使用 CountAsync/LongCountAsync CountAsyncLongCountAsync 方法用於 AnyAsync 方法效率更高的地方。
CA1829:請使用 Length/Count 屬性,不要使用 Enumerable.Count 方法 Count LINQ 方法用於支援對等、更有效率 LengthCount 屬性的型別。
CA1830:偏好在 StringBuilder 上使用強型別的 Append 和 Insert 方法多載 AppendInsert 除了 System.String 之外,還為多種型別提供多載。 如果可以,請優先使用強型別多載,而不要使用 ToString() 和字串多載。
CA1831:在適當情況下,針對字串請使用 AsSpan,而非以 Range 為基礎的索引子 在字串上使用範圍索引器,並隱含地將值指派給 ReadOnlySpan<char> 類型時,將會使用 方法 Substring ,而不是 Slice,這會產生字串要求部分的複本。
CA1832:請使用 AsSpan 或 AsMemory 來取得陣列的 ReadOnlySpan 或 ReadOnlyMemory 區段,而非使用以 Range 為基礎的索引子 在陣列上使用 range-indexer 並將值隱含指派給 ReadOnlySpan<T>ReadOnlyMemory<T> 型別時,會使用方法 GetSubArray,而不是 Slice,這會產生陣列要求部分的複本。
CA1833:取得陣列一部分的 Span 或 Memory 時,請使用 AsSpan 或 AsMemory,不要使用以 Range 為基礎的索引子 在陣列上使用 range-indexer 並將值隱含指派給 Span<T>Memory<T> 型別時,會使用方法 GetSubArray,而不是 Slice,這會產生陣列要求部分的複本。
CA1834:針對單一字元字串使用 StringBuilder.Append(char) StringBuilder 具有一個 Append 多載,其引數為 char。 建議呼叫 char 多載,以提升效能。
CA1835:優先使用以 'Memory' 為基礎的 'ReadAsync' 和 'WriteAsync' 多載 'Stream' 的 'ReadAsync' 多載採用 'Memory<Byte>' 作為第一個引數,而 'WriteAsync' 多載則採用 'ReadOnlyMemory<Byte>' 做為第一個引數。 建議優先呼叫以記憶體為基礎的多載,因為其效率較高。
可用時,請優先使用 IsEmpty,而非 Count 建議使用比 IsEmptyCountLengthCount<TSource>(IEnumerable<TSource>) 更有效率的 LongCount<TSource>(IEnumerable<TSource>) 屬性來判斷物件是否包含任何項目。
CA1837:使用 Environment.ProcessId 而非 Process.GetCurrentProcess().Id Environment.ProcessIdProcess.GetCurrentProcess().Id 更簡單快速。
CA1838:請避免對 P/Invoke 使用 StringBuilder 參數 封送處理 StringBuilder 時都會建立原生緩衝區副本,因此一次封送處理作業需要進行多次配置。
CA1839:使用 'Environment.ProcessPath' 而非 'Process.GetCurrentProcess().MainModule.FileName Environment.ProcessPathProcess.GetCurrentProcess().MainModule.FileName 更簡單快速。
CA1840:使用 'Environment.CurrentManagedThreadId' 而非 'Thread.CurrentThread.ManagedThreadId Environment.CurrentManagedThreadIdThread.CurrentThread.ManagedThreadId 更精簡有效率。
CA1841:建議使用 Dictionary.Contains 方法 ContainsKeys 集合上呼叫 Values 通常比在字典本身呼叫 ContainsKeyContainsValue 更昂貴。
CA1842:不要對單一工作使用 'WhenAll' 搭配單一工作使用 WhenAll 可能會導致效能降低。 請改為等待或傳回該工作。
CA1843:不要對單一工作使用 'WaitAll' 搭配單一工作使用 WaitAll 可能會導致效能降低。 請改為等待或退回任務。
CA1844:加入子類別 'Stream' 時,提供非同步方法的記憶體型覆寫 若要提升效能,請在為 'Stream' 建立子類別時覆寫以記憶體為基礎的非同步方法。 然後,根據記憶體型方法實作陣列型方法。
CA1845:使用以 Span 為基礎的 'string.Concat' 使用 AsSpanstring.Concat (而不是 Substring 和串連運算子) 的效率更高。
CA1846:建議使用 AsSpan,而不是 Substring AsSpan 的效率比 Substring 更高。 Substring 會執行 O (n) 字串複製,而 AsSpan 不會執行且具有固定成本。 AsSpan 也不會執行任何堆積配置。
CA1847:針對單一字元查找使用字元常值 搜尋單一字元時,請使用 String.Contains(char) 而不是 String.Contains(string)
CA1848:使用 LoggerMessage 委派 為了提升效能,請使用 LoggerMessage 委派。
CA1849:在非同步方法中呼叫非同步方法 在已經非同步的方法中,對其他方法的呼叫應該是其非同步版本 (如果存在的話)。
CA1850:建議使用靜態 HashData 方法,而不是 ComputeHash 使用靜態 HashData 方法比建立和管理 HashAlgorithm 執行個體來呼叫 ComputeHash 的效率更高。
CA1851:可能會對 IEnumerable 集合進行多次列舉 IEnumerable 集合可能會被列舉多次。 請考慮使用可避免多個列舉的實作。
CA1852:密封內部型別 無法在組件外部存取,而且在內含組件內沒有子型別的型別則不會密封。
CA1853:不需要呼叫 'Dictionary.ContainsKey(key)' 不需要使用 Dictionary.Remove(key) 來保護 Dictionary.ContainsKey(key)Dictionary<TKey,TValue>.Remove(TKey) 已經檢查索引鍵是否存在,如果索引鍵不存在,則不會擲回。
CA1854:建議使用 'IDictionary.TryGetValue(TKey, out TValue)' 方法 建議使用 'TryGetValue' 而非受 'ContainsKey' 檢查所保護的字典索引子存取。 'ContainsKey' 和索引子都會查找索引鍵,因此使用 'TryGetValue' 可避免額外查找。
CA1855:使用 Span<T>.Clear() 而非 Span<T>.Fill() 呼叫 Span<T>.Clear() 比呼叫 Span<T>.Fill(T),以預設值填滿範圍元素的效率更高。
CA1856:ConstantExpected 屬性的用法不正確 屬性 ConstantExpectedAttribute 未正確套用至參數。
CA1857:此參數預計為常數以獲得最佳效能 無效的自變數會傳遞至以 ConstantExpectedAttribute標註的參數。
CA1858:使用 StartsWith 代替 IndexOf 呼叫 String.StartsWith 比呼叫 String.IndexOf 以檢查字串是否以指定的前置詞開頭的效率更高。
CA1859:盡可能使用具體類型以改善效能 程序代碼會使用介面類型或抽象類型,導致不必要的介面呼叫或虛擬呼叫。
CA1860:避免使用 'Enumerable.Any ()' 擴充方法 使用 LengthCountIsEmpty (如果可能) 比呼叫 Enumerable.Any 來判斷集合型別是否有任何元素的效率更高且更清楚。
CA1861:避免常數數位作為自變數 作為引數傳遞的常數陣列不會被重複使用,這意味著會有額外的效能負擔。 請考慮將它們擷取至「靜態只讀」字段,以改善效能。
CA1862:使用 'StringComparison' 多載方法來進行不區分大小寫的字串比較 當程式代碼呼叫 ToLower()ToUpper() 來執行不區分大小寫的字串比較時,會執行不必要的配置。
CA1863:使用 'CompositeFormat' 若要降低格式化成本,請快取並使用 CompositeFormat 執行個體作為 String.FormatStringBuilder.AppendFormat 的引數。
CA1864:建議使用 IDictionary.TryAdd(TKey, TValue) 方法 Dictionary<TKey,TValue>.ContainsKey(TKey)Dictionary<TKey,TValue>.Add 都會執行查找,這是多餘的。 呼叫 Dictionary<TKey,TValue>.TryAdd 會更有效率,因為它會傳回一個 bool,指出該值是否已新增。 TryAdd 如果索引鍵已經存在,則不會覆寫索引鍵的值。
CA1865-CA1867:使用 char 多載 對於只包含單一 char 的字串,char 多載版本的效能較佳。
CA1868:對集合進行不必要的 'Contains' 呼叫 ISet<T>.Add(T)ICollection<T>.Remove(T) 都會執行查找,因此無須事先呼叫 ICollection<T>.Contains(T)。 直接呼叫 Add(T)Remove(T) 會更有效率,其會傳回布林值,指出該項目是否已新增或移除。
CA1869:快取並重複使用 'JsonSerializerOptions' 實例 如果您的程式碼會執行多次,使用 JsonSerializerOptions 的本機執行個體進行序列化或還原序列化,可能會大幅降低應用程式的效能,因為 System.Text.Json 會在內部將與序列化相關的中繼資料快取到所提供的執行個體中。
CA1870:使用已快取的 'SearchValues' 執行個體 使用快取 SearchValues<T> 實例比直接將值傳遞至 'IndexOfAny' 或 'ContainsAny' 更有效率。
CA1871:請勿將可為 Null 的結構傳遞給 'ArgumentNullException.ThrowIfNull' `ArgumentNullException.ThrowIfNull` 接受 `object`,因此傳遞可為 null 的結構型別時,可能會導致該值被裝箱。
CA1872: 偏好 'Convert.ToHexString' 和 'Convert.ToHexStringLower',而不是以 'BitConverter.ToString' 為基礎的呼叫鏈 將位元組編碼為十六進位字串表示法時,請使用 Convert.ToHexStringConvert.ToHexStringLower 。 這些方法比將 BitConverter.ToStringString.Replace 搭配使用來取代破折號和 String.ToLower 更有效率,且更節省配置資源。
CA1873:避免可能昂貴的日誌記錄 呼叫記載方法時,無論是否啟用記載層級,都會評估其引數。 這可能會導致即使不會寫入記錄訊息,也會執行昂貴的作業。 為了獲得更好的效能,請檢查IsEnabled以保護高成本的日誌記錄呼叫,或使用LoggerMessage模式。
CA1874:使用 'Regex.IsMatch' Regex.IsMatchRegex.Match(...).Success 更簡單快速。
CA1875:使用 'Regex.Count' Regex.CountRegex.Matches(...).Count 更簡單快速。
CA1877:使用 'Path.Combine' 或 'Path.Join' 多載 多個連續的 Path.CombinePath.Join 作業可以使用接受多個路徑片段的多載來折疊為單一呼叫。
CA1878:偏好 ReadOnly Span 屬性勝過只讀陣列欄位 私有的靜態唯讀常數陣列欄位可以被屬性替換 ReadOnlySpan<T> ,讓 C# 編譯器避免管理陣列分配。