2012-04-18 45 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 
     } 
    } 
} 
相關問題