C# 中的后期计算

本文关键字:计算 | 更新日期: 2023-09-27 18:31:32

我正在用c#开发一个应用程序。为了使这个应用程序工作,我发现自己做了一些对于我选择的语言来说感觉很不自然的事情。在经历了许多重构和改进之后,我意识到我试图实现的功能实际上是一种"惰性评估"形式(我认为)。这就是我想要的...

// Criteria 1: Lazy evaluation of expressions
int x = LazyEvaluated.New<int>();
int y = LazyEvaluated.New<int>();
int z = LazyEvaluated.New<int>();
z.Assign(x + y);
Assert.ThrowsException(z.Evalutate());
x.Assign(1);
Assert.ThrowsException(z.Evalutate());
y.Assign(2);
Assert.Equals(3, z.Evaluate());
x.Assign(3);
Assert.Equals(5, z.Evaluate());
// Criteria 2: Referencing relative to parent object    
Car myCar = LazyEvaluated.New<Car>();
Engine engineInMyCar = LazyEvaluated.New<Engine>();
double displacementOfMyEngine = LazyEvaluated.New<double>();
engineInMyCar = myCar.Engine;
displacementOfMyEngine = engineInMyCar.Displacement;
Car subaru = new Car(new FlatFourEngine());
Car falcon = new Car(new InlineSixEngine());
myCar.Assign(subaru);
Assert.IsTypeOf<FlatFourEngine>(engineInMyCar.Evaluate());
Assert.IsEqual(2.0, displacementOfMyEngine.Evaluate());
myCar.Assign(falcon);
Assert.IsTypeOf<InlineSixEngine>(engineInMyCar.Evaluate());
Assert.IsEqual(4.0, displacementOfMyEngine.Evaluate());

这些是我用来说明的简单类定义......

public class Car {
    private readonly Engine engine;            
    public Car(Engine engine) { this.engine = engine; }
    public Engine Engine { get { return engine; } }
}
public abstract class Engine {
    public abstract double Displacement { get; }
}        
public class FlatFourEngine : Engine {
    public override double Displacement { get { return 2.0; } }
}
public class InlineSixEngine : Engine {
    public override double Displacement { get { return 4.0; } }
}    

我想要此功能的原因主要是为了分离关注点。为了说明这一点,让我们进一步了解汽车模拟。我的车由很多零碎组成;发动机、轮胎、内饰等我的轮胎需要每2年由轮胎店更换一次。我的发动机需要机械师每 6 个月更换一次机油。内部需要由细节师每 3 个月吸尘一次。能够做一些类似的事情会很好...

tyreShop.ReplaceTyres(myCar.Tyres, every2Years);
mechanic.ChangeOil(myCar.Engine, every6Months);
detailer.VacuumInterior(myCar.Interior, every3Months);

这种方法的一些原因;

  • 我想一劳永逸。一旦我安排了汽车的一部分进行维修,我希望它持续发生,而无需我的任何进一步投入。
  • 不想打电话给我的每个服务中心,并在我购买新车的那一刻通知他们。事实上,他们不需要知道我有一辆新车,直到需要服务。如果他们试图维修我的车而它不存在,那么他们可以抛出一个例外。
  • 我希望我的每项服务都尽可能简单和专注。为什么要让轮胎车间参考我的整辆车(包括发动机、内饰等),而他们唯一真正关心的是轮胎?
  • 不希望轮胎店给我一套新轮胎,强迫我自己把它们安装(分配)到车上。

没有任何正规的CS教育,我唯一的编程经验是C和C#语言。在过去的6个月里,我刚刚熟悉了c#和.Net。在大多数情况下,我真的很喜欢语言和早期评估。但我现在质疑,我是否最好用不同的语言来解决我的特定问题,并内置对惰性评估的支持。

我的问题是;

  1. 如果我重新开始,解决此类问题的最佳语言是什么?
  2. 是否有任何现有的 c# 平台为延迟计算提供支持?
  3. 在 c# 中实现此工作的替代方案是什么?我应该阅读任何特定的设计模式吗?

C# 中的后期计算

听起来你真正想要的是安排一个操作在以后反复发生。我建议委托 - 可能使用 lambda 表达式 - 是最合适的方法:

scheduler.Schedule(every3Months, () => tyreShop.ReplaceTyres(myCar));

这样,唯一需要了解懒惰方面的代码就是调度程序本身。代码的其余部分都可以假定,当您调用某个方法时,您希望该操作立即发生,这在 C# 中要习惯得多。

.

NET 4 内置了对延迟初始化的支持Lazy请参阅 MSDN 上的文档。http://msdn.microsoft.com/en-us/library/dd642331.aspx