可靠性規則
可靠性規則支持連結庫和應用程式可靠性,例如正確的記憶體和線程使用量。 可靠性規則包括:
統治 | 描述 |
---|---|
CA2000:在失去範圍之前處置物件 | 因為例外事件可能會造成無法執行物件的完成項,因此對象應該在範圍之外之前明確處置物件。 |
CA2002:請勿鎖定具有弱式身分識別的物件 | 對象據說在可以跨應用程式域界限直接存取時具有弱式身分識別。 嘗試取得具有弱式身分識別之物件鎖定的線程,可以透過對相同物件具有鎖定之不同應用程式域中的第二個線程封鎖。 |
CA2007:請勿直接等候工作 | 異步方法 會直接等候Task。 |
CA2008:請勿在沒有傳遞 TaskScheduler 的情況下建立工作 | 工作建立或接續作業會使用未指定 TaskScheduler 參數的方法多載。 |
CA2009:請勿在 ImmutableCollection 值上呼叫 ToImmutableCollection |
ToImmutable 方法在 System.Collections.Immutable 命名空間的不可變集合上不必要地呼叫。 |
CA2011:請勿在其 setter 內指派屬性 | 屬性不小心在自己的 set 存取子內指派值,。 |
CA2012:正確使用 ValueTasks | 從成員調用傳回的 ValueTask 是要直接等候。 嘗試多次取用 ValueTask,或在已知完成之前直接存取其結果,可能會導致例外狀況或損毀。 忽略這類 ValueTask 可能是功能 Bug 的指示,而且可能會降低效能。 |
CA2013:請勿搭配實值型別使用 ReferenceEquals | 使用 System.Object.ReferenceEquals比較值時,如果 objA 和 objB 是實值型別,則會在傳遞至 ReferenceEquals 方法之前進行 Boxed。 這表示即使 objA 和 objB 都代表實值類型的相同實例,ReferenceEquals 方法仍會傳回 false。 |
CA2014:請勿在迴圈中使用 stackalloc。 | stackalloc 所配置的堆疊空間只會在目前方法調用的結尾釋放。 在迴圈中使用,可能會導致未系結的堆疊成長和最終堆疊溢位狀況。 |
CA2015:請勿針對衍生自 MemoryManager<T> 的類型定義完成項 | 將完成項新增至衍生自 MemoryManager<T> 的類型,可能會允許在記憶體仍由 Span<T>使用時釋放記憶體。 |
CA2016:將 CancellationToken 參數轉送至採用一個 的方法 | 將 CancellationToken 參數轉送至採用方法,以確保作業取消通知會正確傳播,或明確傳入 CancellationToken.None ,以指出刻意不會傳播令牌。 |
CA2017:參數計數不符 | 記錄訊息範本中提供的參數數目不符合具名佔位元元的數目。 |
CA2018:要 count Buffer.BlockCopy 自變數應指定要複製的位元元組數目 |
使用 Buffer.BlockCopy 時,count 自變數會指定要複製的位元元組數目。 您應該只在元素大小完全相同的一個字節的陣列上使用 Array.Length 自變數 count 。
byte 、sbyte 和 bool 陣列具有大小一個字節的專案。 |
CA2019:ThreadStatic 字段不應使用內嵌初始化 |
以 ThreadStaticAttribute 標註的欄位會在visual Basic 建構函式中內嵌或明確初始化 static (Shared ) 建構函式中。 |
CA2020:防止 IntPtr/UIntPtr 內建運算符所造成的行為變更 | .NET 7 中新增的一些內建運算符的行為與 .NET 6 和舊版中的使用者定義運算符不同。 某些運算符,用來在未核取的內容中擲回,但溢位不會再擲回,除非包裝在已檢查的內容中。 除非包裝在未核取的內容中,否則先前未擲回已檢查內容中的某些運算符現在會擲回。 |
CA2021:請勿呼叫具有不相容類型的 Enumerable.Cast<T> 或 Enumerable.OfType<T> | 對 Enumerable.Cast<TResult>(IEnumerable) 或 Enumerable.OfType<TResult>(IEnumerable) 的呼叫會指定與輸入集合類型不相容的類型參數。 |
CA2022:避免使用 Stream.Read 不實際讀取 | 對 Stream.Read 的呼叫可能會傳回比要求的位元組少,因此如果未檢查傳回值,則會產生不可靠的程序代碼。 |
CA2024:請勿在異步方法中使用 StreamReader.EndOfStream | 當沒有任何數據緩衝處理時,屬性 StreamReader.EndOfStream 可能會導致非預期的同步封鎖。 請改為直接使用 StreamReader.ReadLineAsync(),這會在到達數據流結尾時傳回 null 。 |