我需要公开一个类实例的"is mapped?"状态.结果是由基本判断决定的.它是not,简单地公开一个字段的值.我不确定应该使用只读属性还是方法.

Read-only property:

public bool IsMapped
{
    get
    {
        return MappedField != null;
    }
}

Method:

public bool IsMapped()
{
    return MappedField != null;
}

我读过MSDN的Choosing Between Properties and Methods,但我仍然不确定.

推荐答案

C#标准规定

§ 8.7.4

property是提供对对象或类的特征的访问的成员.属性的示例包括字符串的长度、字体的大小、窗口的标题、客户的姓名等.属性是领域的自然延伸.两者都是具有关联类型的命名成员,访问字段和属性的语法相同.但是,与字段不同,属性不表示存储位置.相反,属性具有访问器,用于指定在读取或写入其值时要执行的语句.

而as方法定义为

§8.7.3

method是实现可由对象或类执行的计算或操作的成员.方法有一个形式参数列表(可能为空)、一个返回值(除非该方法的返回类型为void),并且可以是静态的,也可以是非静态的.

Propertiesmethods用于实现encapsulation.属性封装数据,方法封装逻辑.这就是为什么如果要公开数据,就应该 Select 只读属性.在你的例子中,没有任何逻辑可以修改你的对象的内部状态.你想要provide access to a characteristic of an object.

对象IsMapped的实例是否是对象的特征.它包含一个支票,但这就是为什么你有属性来访问它.属性可以使用逻辑定义,但它们不应该公开逻辑.就像第一句话中提到的例子:想象一下String.Length属性.根据实现的不同,该属性可能会在字符串中循环并计数字符.它也会执行一个操作,但"从外部"它只会给出一个关于对象内部状态/特征的声明.

.net相关问答推荐

Docker失败文件找不到

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

线程安全性的单元测试?

在 WebApi 中需要 SSL?

比较 C# 中的字符串和对象

生产代码中的 System.Diagnostics.Debug.WriteLine

获取当前方法的名称

多个等待与 Task.WaitAll - 等效?

为什么 Interlocked.Exchange 不支持布尔类型?

HashSet 是否保留插入顺序?

如何使用 Android 使用 WCF 服务

String.Format - 它是如何工作的以及如何实现自定义格式字符串

MemoryStream.Close() 或 MemoryStream.Dispose()

POCO 是什么意思?

覆盖 ASP.NET MVC 中的授权属性

何时何地使用 GetType() 或 typeof()?

静态方法继承的正确替代方法是什么?

C# 相当于 Java 的 Exception.printStackTrace()?

在 IIS 中访问 .svc 文件时出现 HTTP 404

浮动与双重性能