CA2211:非常數欄位不應該為可見的
型別名稱 |
NonConstantFieldsShouldNotBeVisible |
CheckId |
CA2211 |
分類 |
Microsoft.Usage |
中斷變更 |
中斷 |
原因
公用或保護的靜態欄位既非常數,亦非唯讀。
規則描述
既非常數,亦非唯讀的靜態欄位不是安全執行緒。 必須小心控制對這類欄位的存取,而且需要進階的程式設計技巧同步 (Synchronize) 對類別物件的存取。 因為這些技巧不易學會和精通,而測試這類物件也有困難度,所以最好能用靜態欄位儲存不會變更的資料。 此規則可套用到程式庫,但應用程式不應公開 (Expose) 任何欄位。
如何修正違規
若要修正此規則的違規情形,請將靜態欄位設為常數或唯讀。 如果無法這麼做,請將型別重新設計為使用替代機制,例如管理基礎欄位之安全執行緒存取的安全執行緒屬性。 請注意,如鎖定爭用和死結 (Deadlock) 這類的問題可能會影響程式庫的效能和行為。
隱藏警告的時機
如果您正在開發應用程式,因此對包含靜態欄位之型別的存取具有完全控制,則可以放心地隱藏此規則的警告。 使用非常數的靜態欄位會使程式開發人員難以正確使用程式庫,因此程式庫設計工具不應該隱藏此規則的警告。
範例
下列範例顯示違反此規則的型別。
Imports System
Namespace UsageLibrary
Public Class SomeStaticFields
' Violates rule: AvoidNonConstantStatic;
' the field is public and not a literal.
Public Shared publicField As DateTime = DateTime.Now
' Satisfies rule: AvoidNonConstantStatic.
Public Shared ReadOnly literalField As DateTime = DateTime.Now
' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
' the field is private.
Private Shared privateField As DateTime = DateTime.Now
End Class
End Namespace
using System;
namespace UsageLibrary
{
public class SomeStaticFields
{
// Violates rule: AvoidNonConstantStatic;
// the field is public and not a literal.
static public DateTime publicField = DateTime.Now;
// Satisfies rule: AvoidNonConstantStatic.
public static readonly DateTime literalField = DateTime.Now;
// Satisfies rule: NonConstantFieldsShouldNotBeVisible;
// the field is private.
static DateTime privateField = DateTime.Now;
}
}