C#从不同的对象分配变量

时间:2012-04-18 21:39:58

标签: c#

我不太确定如何用C#术语提出我的问题,所以请忍受冗长的解释。

我正在编写股票交易算法。当算法开始时,它会检查它应用于哪种仪器(在这种情况下,无论是股票还是期货),然后根据工具,为“double x”赋值。

如果它是未来的工具,那么分配是一个简单,平坦的值(在这种情况下,“double x = 5;”。但是,如果它是一个股票,我希望将“x”分配给一个来自另一个对象的值 - 让我们调用对象“Algo2”和值“y”。所以,在我的脚本中,赋值如下:“double x = Algo2.y”(注意:这是编辑器中的惯例我是这个代码块在算法开始时只运行一次。

我在这里想要实现的是告诉我的算法在“公式”中使用“x”时使用“Alv2.y”的最新值,例如“EntryValue = Price + x”。然而,最新发生的是“x”在程序开始时被永久赋值为“Algo2.y”,并且由于该块永远不会再次运行,所以始终保持该值。

任何人都可以帮助使用语法,以便不是将值赋给“x”,而是指向获取“Algo2.y”的最新值吗?

谢谢!

8 个答案:

答案 0 :(得分:2)

将'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;
    }
  }
}

答案 1 :(得分:1)

我会使用方法返回您的最新值

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");
  }
}

答案 2 :(得分:1)

可以使用类似的内容:

double X {
  get { 
        if(isStock()) 
           return Algo2.y; 
        else 
           return 5;
  }
}

答案 3 :(得分:1)

为它编写一个函数:

double getAlgo2YValue()
{
    return Algo2.y; // or Algo2.getY(), another function if you can't access it
}

在您的主算法中,现在调用:

x = getAlgo2YValue();

更新X。

答案 4 :(得分:1)

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();

答案 5 :(得分:0)

给Algo2一个Algo的引用,这样就没有&#39;加倍X&#39;需要复制。然后,Algo可以随时取消引用Algo2中的实际值(线程安全问题?)。

答案 6 :(得分:0)

值数据类型(例如 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);

答案 7 :(得分:0)

您需要的是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
      }
   }
}