c# - 属性(property)决定论

标签 c# properties deterministic

在 C# 中有什么方法可以将属性标记为确定性的?

我问的原因是我经常发现自己声明一个局部变量并将属性读入其中,而不是多次访问该属性。

有什么方法可以将属性修饰为确定性的,以便编译器可以优化对该属性的多次访问?我猜测在这种情况下,该类需要是不可变的,并且需要这样装饰。

这是存在的东西还是我在抓救命稻草?

最佳答案

如果属性很简单,比如隐式属性:

public int X { get; set; }

或者从局部变量读取:

public int X { get { return _x; } }

然后编译器将优化代码,以便多次访问该属性与将属性放入变量并访问它之间没有区别。

我通过比较 1 亿次迭代访问属性 10 次和将属性复制到变量并访问 10 次来验证这一点,根本没有可测量的差异。

通常,属性应该是轻量级的,这样您就不必在每次访问它时都进行繁重的处理。如果属性值的获取成本很高,则该类应在内部缓存该值,以便读取属性只会在第一次进行成本高昂的操作(延迟加载模式)。

如果一个属性每次获取的成本都很高,那么它根本不应该是一个属性,而应该是一个 getter 方法。

关于c# - 属性(property)决定论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716053/

相关文章:

c# - '使用类型 .. 不支持 NetDataContractSerializer' - 为什么要使用 NetDataContractSerializer?

c# - 无法注销 Azure Rms 移动服务用户

ruby - Ruby 在 python 中相当于 cached_property 是什么?

objective-c - 使用 ARC 的原始数据类型的综合属性——弱还是赋值?

c# - 浮点不准确的确定性如何?

c# - 如何使用 API 或更改源代码获取 azure 聊天机器人的对话数据?

c# - XtraGridView 上的自定义 SUM 摘要

java - 将多个 java 属性值读取到字符串或数组中

c++ - 如何控制 C 数学是否使用 SSE2?

c++ - UB 能否导致多个单线程应用程序运行产生不同的输出?