2012-04-18 61 views
3

我不太清楚如何以C#的方式提问我的问题,所以请耐心解释一下这个冗长的解释。C#从不同的对象中分配一个变量

我在写股票交易算法。当算法开始时,它会检查它应用于什么类型的工具(在本例中为股票或期货),然后根据工具为“double x”赋值。

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

我在这里想要实现的是告诉我的算法在每次“x”时获得最新的“Algo2.y”值用于“EntryValue = Price + x”等公式中,但是,在程序开始时,“x”会永久赋值“Algo2.y”,并且由于该块永远不会再次运行,仍然是这个缺点整个价值。

任何人都可以使用语法帮助,这样的替代值分配给“X”,它只是分获得“Algo2.y”的最新值whevever它叫什么名字?

谢谢!

+0

您可以使用列表来存储所有的y值从列表中获得最新的y值,并使其Algo2.y – 2012-04-18 21:43:57

+0

听起来好像你需要**使用[代表](HTTP:// msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx)来连接你的算法。**我没有时间给出正确的答案,但我确信有人可以强制。 – 2012-04-18 21:45:42

+0

谢谢罗伯特。现在你提到它了,我隐约记得有关代表正在做我正在努力实现的内容。为了简单起见,我最终使用了下面另一张海报提出的Method解决方案,但代表将列在我的清单上以供学习! – 2012-04-18 21:56:13

回答

1

写一个函数为它:

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

在你的主要算法,现在称之为:

x = getAlgo2YValue(); 

要更新X

+0

这工作完美!谢谢! – 2012-04-18 21:57:14

+0

嗯,这与从始至终分配'x = Algo2.y'有何不同?没有功能? – 2012-04-18 22:01:26

+0

@Shedal我知道,事实并非如此,但如果他稍后决定Algo2.y的价值在检索时应该改变,他会更容易地改变我的方法而不是10条语句他不会吗? :) – MarioDS 2012-04-18 22:03:27

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

谢谢!我使用了函数,尽管它很好地知道我也可以使用Properties。 – 2012-04-18 22:00:32

2

使“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

可以使用类似:

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

让Algo2参考Algo,以便不需要“双X”副本。然后,Algo可以随时取消Algo2中的实际值(线程安全性问题?)。

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

然后,用ValueContainer实例来替换你的x任何需要的地方,并使用CurrentValue属性来获取价值。您创建的每个版本使用不同的构造函数,则:

ValueContainer container = null; 

if(stock) 
    container = new ValueContainer(5); 
else 
    container = new ValueContainer(Algo2); 
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(); 
+0

完全过度复杂的问题。 – Servy 2012-04-18 21:49:14

+0

@Servy只是为了这个目的创建一个类和一个属性。 – 2012-04-18 21:50:22

+0

你不需要一个新的类,只需要一个属性/方法。你也需要所有这一切。你不能只是像这样躺着一个'Func',并且需要调用一个方法来初始化它。 – Servy 2012-04-18 21:52:00

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 
     } 
    } 
} 
相关问题