gpt4 book ai didi

c# - C# 中的后期评估?

转载 作者:太空狗 更新时间:2023-10-30 00:26:39 24 4
gpt4 key购买 nike

我正在使用 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# 中完成这项工作有哪些替代方案?是否有任何我应该阅读的特定设计模式?

最佳答案

这听起来像是您真正在安排一个 Action 在以后重复发生。我建议委托(delegate)——可能使用 lambda 表达式——是最合适的方法:

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

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

关于c# - C# 中的后期评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10204154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com