CA1044:属性不应是只写的

属性
规则 ID CA1044
标题 属性不应是只写的
类别 设计
修复是中断修复还是非中断修复 重大
在 .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; }
}