C# 从其他对象赋值变量
本文关键字:赋值 变量 对象 其他 | 更新日期: 2023-09-27 18:31:39
我不太确定如何用C#术语提出我的问题,所以请耐心等待冗长的解释。
我正在编写一个股票交易算法。当算法启动时,它会检查它应用于哪种工具(在这种情况下,股票或期货),然后根据工具,为"双倍 x"分配一个值。
如果它是未来的工具,那么赋值是一个简单的平面值(在本例中为"double x = 5;")。但是,如果它是一个股票,我希望将"x"分配给另一个对象的值 - 让我们称该对象为"Algo2",将值称为"y"。因此,在我的脚本中,赋值如下:"double x = Algo2.y"(注意:这是我使用的编辑器中的约定)。此代码块仅在算法开始时运行一次。
我在这里要实现的是告诉我的算法在诸如"EntryValue = Price + x"之类的公式中使用"x"时获取"Algo2.y"的最新值。 然而,发生的事情是"x"在程序开始时被永久分配"Algo2.y"的值,并且由于该块永远不会再次运行,因此始终保持该常量值。
任何人都可以帮助语法,以便它不是为"x"赋值,而是简单地指向获取"Algo2.y"的最新值,无论它被称为什么?
谢谢!
将"x"设为属性,以便每次请求 x 时它都会获取值。
class StockInstrument
{
public double Value //x isn't a good name, I'll use "Value"
{
get
{
if(...) return 5.0;
else return Algo2.y;
}
}
}
为它编写一个函数:
double getAlgo2YValue()
{
return Algo2.y; // or Algo2.getY(), another function if you can't access it
}
在您的主算法中,现在调用:
x = getAlgo2YValue();
要更新 X。
我会使用一种方法来返回您的最新值
public double GetXValue()
{
if (AlgoType == Algos.Futures)
{
return 5.0;
}
else if (AlgoType == Algos.Stock)
{
return Algo2.y;
}
//else
throw new Exception("unknown algo type");
}
这是相当困难的编码,但它可以使用委托和算法的封装来清理,但在低级别 - 这就是这个想法。此外,有些人更喜欢为此使用属性 - 只是在get
具有修改影响时不要使用属性
public double X
{
get
{
if (AlgoType == Algos.Futures)
{
return 5.0;
}
else if (AlgoType == Algos.Stock)
{
return Algo2.y;
}
//else
throw new Exception("unknown algo type");
}
}
可以使用如下内容:
double X {
get {
if(isStock())
return Algo2.y;
else
return 5;
}
}
Func<int> getX;
if(isFuture)
getX = () => 5;
else
getX = () => Algo.y;
// using getX() will always return the current value of Algo.y,
// in case it's a stock.
int xval = getX();
给 Algo2 一个对 Algo 的引用,这样就不需要"双 X"拷贝了。然后,Algo 可以随时取消引用 Algo2 中的实际值(线程安全是一个问题?
值数据类型(如 int)将始终按值复制,而不是作为引用。但是,您可以做的是以稍微不同的方式构建您的解决方案,然后它将提供正确的价值。例如:
public class ValueContainer
{
protected Algo2 _reference = null;
protected double _staticValue = 0;
public double CurrentValue
{
get
{
if(_reference == null)
return _staticValue;
return _reference.y;
}
}
public ValueContainer(Algo2 reference)
{
_reference = reference;
}
public ValueContainer(double value)
{
_staticValue = value;
}
}
然后,根据需要将x
替换为ValueContainer
实例,并使用 CurrentValue
属性获取值。然后,使用不同的构造函数创建每个版本:
ValueContainer container = null;
if(stock)
container = new ValueContainer(5);
else
container = new ValueContainer(Algo2);
的是一个属性包装器,供x
根据仪器类型控制返回的值。下面是一个示例,需要对应用进行一些重大调整。
public class Instrument
{
// an example enum holding types
public InstrumentType Type {get; set;}
// x is not a great name, but following your question's convention...
public double X
{
get
{
if(type == InstrumentType.Stock)
return Algo2.y();
// note that I changed this to be a method rather than a property
// Algo2.y() should be static so it can be called without an instance
else if(type == InstrumentType.Future)
return 5.0;
else
// return some default value here
}
}
}