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"的最新值,无论它被称为什么?

谢谢!

C# 从其他对象赋值变量

将"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
      }
   }
}