CA1044:プロパティを書き込み専用にすることはできません

プロパティ
ルール ID CA1044
Title プロパティを書き込み専用にすることはできません
[カテゴリ] デザイン
修正が中断ありか中断なしか あり
.NET 8 では既定で有効 いいえ

原因

あるプロパティに set アクセサーがあるが、get アクセサーがありません。

既定では、この規則の対象は外部から参照できる型のみですが、これは構成可能です。

規則の説明

get アクセサーからはプロパティの読み取りアクセスが与えられ、set アクセサーからは書き込みアクセスが与えられます。 読み取り専用のプロパティは許容され、必要な場合もよくありますが、書き込み専用のプロパティを使用することはデザインのガイドラインで禁止されています。 これは、値を設定できてもその値を参照できず、セキュリティが確保されないためです。 また、読み取りアクセスがないと、共有オブジェクトのステータスを参照できないため、実用性が制限されます。

違反の修正方法

この規則の違反を修正するには、get アクセサーをプロパティに追加します。 あるいは、書き込み専用プロパティの動作が必要な場合、このプロパティをメソッドに変換することを検討してください。

どのようなときに警告を抑制するか

この規則からの警告は抑制しないことをお勧めします。

分析するコードを構成する

次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するか構成します。

このオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (デザイン) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定の API サーフェイスを含める

ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.api_surface = private, internal

次の例では、BadClassWithWriteOnlyProperty は、書き込み専用プロパティを持つ型です。 GoodClassWithReadWriteProperty には修正後のコードが含まれています。

Imports System

Namespace ca1044

    Public Class BadClassWithWriteOnlyProperty

        Dim someName As String

        ' Violates rule PropertiesShouldNotBeWriteOnly.
        WriteOnly Property Name As String
            Set
                someName = Value
            End Set
        End Property

    End Class

    Public Class GoodClassWithReadWriteProperty

        Property Name As String

    End Class

End Namespace
public class BadClassWithWriteOnlyProperty
{
    string? _someName;

    // Violates rule PropertiesShouldNotBeWriteOnly.
    public string? Name
    {
        set
        {
            _someName = value;
        }
    }
}

public class GoodClassWithReadWriteProperty
{
    public string? Name { get; set; }
}