c# - 计算的只读属性
问题描述
我正在尝试在对象上实现属性,这些属性的值是从其他对象的属性值派生的。例如,名为 Student 的类中名为 TotalPoints 的属性在 get{} 中具有以下代码,
foreach(var subject in Subjects)
{
_totalPoints += subject.Points;
}
return _totalPoints;
这适用于简单的情况。但是,当涉及更多级别时,例如,Subject.Points 实际上是指其他东西。计算会慢一些。我想弄清楚的是:
如果有什么方法可以检测Points的值是否有任何变化,如果没有,我不想重新计算_totalPoints;
有没有其他方法可以实现这一点?我在想的是是否可以“通知” TotalPoints 其中一个 Subject.Points 的值已经改变,所以 TotalPoints 需要重新计算。
欣赏是否有人有任何想法。谢谢。
解决方案
您所描述的是一个事件驱动的系统(请参阅dot net events)。这是一个简单的例子:
public class PointsProvider
{
public event Action<int> OnPointsChanged;
private int points;
public int Points
{
get => points;
set
{
if (points == value)
return;
int oldValue = points;
points = value;
OnPointsChanged?.Invoke(points - oldValue);
}
}
}
public class TotalPointsProvider
{
private PointsProvider providerA, providerB;
private int totalPoints;
public int TotalPoints => totalPoints;
public TotalPointsProvider()
{
providerA = new PointsProvider();
providerA.OnPointsChanged += UpdateTotalPoints;
providerB = new PointsProvider();
providerB.OnPointsChanged += UpdateTotalPoints;
totalPoints = providerA.Points + providerB.Points;
}
private void UpdateTotalPoints(int delta)
{
totalPoints += delta;
}
}
TotalPointsProvider
收到通知,一旦它的PointsProvider
一个变化和更新它自己的价值。
如果您的子系统 ( PointsProvider
) 中有很多更改但不经常请求结果,您可能想要构建一个惰性系统:
public class PointsProvider
{
public event Action OnPointsChanged;
private int points;
public int Points
{
get => points;
set
{
if (points == value)
return;
points = value;
OnPointsChanged?.Invoke();
}
}
}
public class TotalPointsProvider
{
private PointsProvider providerA, providerB;
private bool dirty = true;
private int totalPoints;
public int TotalPoints
{
get
{
if (dirty)
{
totalPoints = providerA.Points + providerB.Points;
dirty = false;
}
return totalPoints;
}
}
public TotalPointsProvider()
{
providerA = new PointsProvider();
providerA.OnPointsChanged += RecalculationNecessary;
providerB = new PointsProvider();
providerB.OnPointsChanged += RecalculationNecessary;
}
private void RecalculationNecessary()
{
dirty = true;
}
}
推荐阅读
- openshift - 在 openshift 中执行 kompose 最后会抛出 Unauthorized
- oracle-data-integrator - ODI 12c 使用 SDK 智能导入到 Exec 存储库的行为类似于导入到开发存储库
- regex - 特定单词和特殊字符后的正则表达式
- android - 如何检测父活动是否已实例化?
- angular - Angular APP_INITIALIZER 提供者将一项注入服务视为未定义,但其他注入服务就好了
- ios - 在 Ubuntu 上发布未签名的基于 Cordova 的 iOS 应用程序
- python - 有没有办法知道在被认为是热门商品后直到一天结束时售出了多少商品?
- c# - 例外:关联失败。在 C# 中使用 Okta 的未知位置
- c++ - C++ 计时计时器在线程中慢 1000 倍
- php - PHP 7.4 是否破坏了 fgets(STDIN)?