效能規則
效能規則支援高效能程式庫與應用程式。
本節內容
規則 | 描述 |
---|---|
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 程式庫,並比較所有欄位的內容。 但是 Reflection 相當耗費運算資源,而且可能不需要比較每個欄位是否相等。 如果希望使用者比較或排序執行個體,或是使用執行個體做為雜湊資料表索引鍵,則您的實值類型應實作 Equals。 |
CA1819:屬性不應該傳回陣列 | 即使屬性是只讀的,屬性所傳回的陣列也不會受到寫入保護。 若要保持陣列為防止遭他人修改,屬性必須傳回陣列複本。 一般而言,使用者不了解呼叫這類屬性所造成的不良效能影響。 |
CA1820:應該使用字串長度測試空白字串 | 使用 String.Length 屬性或 String.IsNullOrEmpty 方法比較字串,明顯地會比使用 Equals 還快。 |
CA1821:必須移除空的完成項 | 請盡可能避免使用完成項,因為追蹤物件存留期 (Lifetime) 時將會產生額外的效能負荷。 空完成項會產生額外的額外負荷,而不會有任何好處。 |
CA1822:將成員標記為 static | 可以將不會存取執行個體資料或不會呼叫執行個體方法的成員,標記為 static (在 Visual Basic 中為 Shared)。 將方法標記為 static 之後,編譯器將對這些成員發出非虛擬呼叫位置。 這麼做可以讓重視效能的程式碼獲得可觀的效能。 |
CA1823:避免包含未使用的私用欄位 | 偵測到似乎不能在組件內存取的私用欄位。 |
CA1824:組件必須標記 NeutralResourcesLanguageAttribute | NeutralResourcesLanguage 屬性會通知 Resource Manager 語言,該語言是用來顯示元件中性文化特性的資源。 這可改善載入第一個資源的查詢效能,而且可以減少您的工作集。 |
CA1825:請避免長度為零的陣列配置 | 初始化長度為零的陣列會導致不必要的記憶體配置。 請改為呼叫 Array.Empty,使用以靜態方式配置的空陣列執行個體。 會在此方法的所有叫用之間共用記憶體配置。 |
CA1826:請使用屬性,不要使用 Linq Enumerable 方法 | Enumerable LINQ 方法用於支援對等、更有效率屬性的型別。 |
CA1827:不要在可使用 Any 時使用 Count/LongCount | Count 或 LongCount 方法用於 Any 方法效率更高的地方。 |
CA1828:不要在可使用 AnyAsync 時使用 CountAsync/LongCountAsync | CountAsync 或 LongCountAsync 方法用於 AnyAsync 方法效率更高的地方。 |
CA1829:請使用 Length/Count 屬性,不要使用 Enumerable.Count 方法 | Count LINQ 方法用於支援對等、更有效率 Length 或 Count 屬性的型別。 |
CA1830:建議在 StringBuilder 上使用強型別 Append 及 Insert 方法多載 | Append 和 Insert 提供 System.String 以外的多個類型多載。 可能的話,請使用強型別多載,而非使用 ToString () 和以字串為基礎的多載。 |
CA1831:在適用情況下,請使用 AsSpan 做為字串,不要使用範圍型的索引子 | 在字串上使用範圍索引器,並隱含地將值指派給 ReadOnlySpan<char> 類型時,將會使用 方法 Substring ,而不是 Slice,這會產生字串要求部分的複本。 |
CA1832:請使用 AsSpan 或 AsMemory 來取得陣列的 ReadOnlySpan 或 ReadOnlyMemory 部分,不要使用範圍型的索引子 | 在陣列上使用 range-indexer 並將值隱含指派給 ReadOnlySpan<T> 或 ReadOnlyMemory<T> 型別時,會使用方法 GetSubArray,而不是 Slice,這會產生陣列要求部分的複本。 |
CA1833:請使用 AsSpan 或 AsMemory 取得陣列的 Span 或 Memory 部分,不要使用範圍型的索引子 | 在陣列上使用 range-indexer 並將值隱含指派給 Span<T> 或 Memory<T> 型別時,會使用方法 GetSubArray,而不是 Slice,這會產生陣列要求部分的複本。 |
CA1834:針對單一字元字串使用 StringBuilder.Append(char) | StringBuilder 具有接受 char 做為其引數的 Append 多載。 偏好呼叫 char 多載以改善效能。 |
CA1835:建議針對 'ReadAsync' 和 'WriteAsync' 使用採用 'Memory' 的多載 | 'Stream' 的 'ReadAsync' 多載採用 'Memory<Byte>' 作為第一個引數,而 'WriteAsync' 多載則採用 'ReadOnlyMemory<Byte>' 做為第一個引數。 建議呼叫記憶體型多載,如此效率更高。 |
CA1836:當 可用時,建議使用 IsEmpty 而不是Count |
建議使用比 Count 、Length 、Count<TSource>(IEnumerable<TSource>) 或 LongCount<TSource>(IEnumerable<TSource>) 更有效率的 IsEmpty 屬性來判斷物件是否包含任何項目。 |
CA1837:使用 Environment.ProcessId 而非 Process.GetCurrentProcess().Id |
Environment.ProcessId 比 Process.GetCurrentProcess().Id 更簡單快速。 |
CA1838:請避免對 P/Invoke 使用 StringBuilder 參數 |
StringBuilder 的封送處理一律會建立原生緩衝區複本,導致一個封送處理作業有多個配置。 |
CA1839:使用 'Environment.ProcessPath' 而非 'Process.GetCurrentProcess().MainModule.FileName | Environment.ProcessPath 比 Process.GetCurrentProcess().MainModule.FileName 更簡單快速。 |
CA1840:使用 'Environment.CurrentManagedThreadId' 而非 'Thread.CurrentThread.ManagedThreadId | Environment.CurrentManagedThreadId 比 Thread.CurrentThread.ManagedThreadId 更精簡有效率。 |
CA1841:建議使用 Dictionary.Contains 方法 | 在 Keys 或 Values 集合上呼叫 Contains 通常比在字典本身呼叫 ContainsKey 或 ContainsValue 更昂貴。 |
CA1842:不要對單一工作使用 'WhenAll' | 搭配單一工作使用 WhenAll 可能會導致效能降低。 請改為等候或傳回工作。 |
CA1843:不要對單一工作使用 'WaitAll' | 搭配單一工作使用 WaitAll 可能會導致效能降低。 請改為等候或傳回工作。 |
CA1844:加入子類別 'Stream' 時,提供非同步方法的記憶體型覆寫 | 若要改善效能,請在加入子類別 'Stream' 時覆寫記憶體型的非同步方法。 然後,根據記憶體型方法實作陣列型方法。 |
CA1845:請使用範圍型的 'string.Concat' | 使用 AsSpan 和 string.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.ContainsKey(key) 來保護 Dictionary.Remove(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 ()' 擴充方法 | 使用 Length 、Count 或 IsEmpty (如果可能) 比呼叫 Enumerable.Any 來判斷集合型別是否有任何元素的效率更高且更清楚。 |
CA1861:避免常數數位作為自變數 | 傳遞為自變數的常數數位不會重複使用,這表示效能額外負荷。 請考慮將它們擷取至「靜態只讀」字段,以改善效能。 |
CA1862:使用 'StringComparison' 方法多載來執行不區分大小寫的字串比較 | 當程式代碼呼叫 ToLower() 或 ToUpper() 來執行不區分大小寫的字串比較時,會執行不必要的配置。 |
CA1863:使用 'CompositeFormat' | 若要降低格式設定成本,請快取 並使用 CompositeFormat 實例作為 或StringBuilder.AppendFormat 的自變數String.Format 。 |
CA1864:偏好 'IDictionary.TryAdd(TKey, TValue)' 方法 | 和 Dictionary<TKey,TValue>.Add 都會Dictionary<TKey,TValue>.ContainsKey(TKey)執行重複的查閱。 呼叫 會更有效率地呼叫 Dictionary<TKey,TValue>.TryAdd,它會傳回 bool ,指出是否新增值。 TryAdd 如果索引鍵已經存在,則不會覆寫索引鍵的值。 |
CA1865-CA1867:使用 char 多載 | char 多載是具有單一 char 之字串的較佳效能多載。 |
CA1868:對集合不必要呼叫 'Contains' | 和 ICollection<T>.Remove(T) 都會ISet<T>.Add(T)執行查閱,讓其事先呼叫ICollection<T>.Contains(T)變得備援。 呼叫或Remove(T)直接呼叫Add(T)會更有效率,它會傳回 Boolean 值,指出專案是否已新增或移除。 |
CA1869:快取並重複使用 'JsonSerializerOptions' 實例 | 如果您的程式代碼執行多次,使用的 JsonSerializerOptions 本機實例進行串行化或還原串行化,可能會大幅降低應用程式的效能,因為 System.Text.Json 會在內部將串行化相關元數據快取至提供的實例。 |
CA1870:使用快取的 'SearchValues' 實例 | 使用快取 SearchValues<T> 實例比直接將值傳遞至 'IndexOfAny' 或 'ContainsAny' 更有效率。 |
CA1871:請勿將可為 Null 的結構傳遞至 'ArgumentNullException.ThrowIfNull' | 'ArgumentNullException.ThrowIfNull' 接受 'object',因此傳遞可為 Null 的結構可能會導致 Boxed 值。 |
CA1872: 偏好 'Convert.ToHexString' 和 'Convert.ToHexStringLower',而不是以 'BitConverter.ToString' 為基礎的呼叫鏈 | 將位元組編碼為十六進位字串表示法時,請使用 Convert.ToHexString 或 Convert.ToHexStringLower 。 這些方法比搭配 使用 BitConverter.ToString 取代 String.Replace 破折號 和 String.ToLower更有效率且配置易用。 |