2012-05-16 85 views
0

的財產陣列我是一個新開發的C#MVC3對象。 我有一個問題,我無法創建包含對象內屬性數組的對象。我不能創建一個包含內部對象

例如,我想創建實例ABC.Property [] 10個陣列。

ABC.Property [0]

ABC.Property [1]

ABC.Property [2] ..... .... ABC.Property [10]

我用調試模式檢查並發現ABC.Property []爲空。所以我不能將該值添加回該對象的數組。

如何與化子性質的陣列箱對象?

謝謝。

namespace finance3.Models 
{ 
public class Expected_and_Risk 
{ 


    public decimal[] Prop { get; set; } 
    public decimal[] Forecast { get; set; } 
    public string[] Name { get; set; } 
    public decimal[] AxB { get; set; } 
    public decimal[] PowAxB { get; set; } 


    public decimal ExpectValue(Expected_and_Risk abc) 
    { 

     decimal count = abc.Forecast.Count(); 

     Expected_and_Risk Result = new Expected_and_Risk(); 

     for (int i = 0 ; i < count ; i++) 
     { 
      // here is the problem 
      // i cannot add new data to array because it has no dimemsion and i tried this 
      // 
      // Expected_and_Risk[] Result = new Expected_and_Risk[10]; 
      // 
      // but it didn't work 

      Result.Name[i] = abc.Name[i]; 
      Result.Prop[i] = abc.Prop[i]; 
      Result.Forecast[i] = abc.Forecast[i]; 
      Result.AxB[i] = abc.Prop[i] * abc.Forecast[i]; 


      decimal a = Result.AxB[i]; 
      decimal sumAxB =+ a; 

      double temp = (double)(a * a) ; 
      Result.PowAxB[i] = (decimal)(temp); 

     } 

     return Convert.ToDecimal(Result); 
    } 
} 

} 

回答

0

更好的辦法可能是添加下面的方法到Expected_and_Risk 類和構造函數中調用它。

編輯 - 編輯是爲了使Initialize private,並在構造函數中調用它。

void Initialize(int size) 
{ 
    Prop = new decimal[size]; 
    AxB = new decimal[size]; 
    Forecast = new decimal[size]; 
    PowAxB = new decimal[size]; 
    Name = new string[size]; 
} 

    public Expected_and_Risk(int size) 
    { 
     .... 
     Initialize(size); 
    } 

後使用它在ExpectValue像

Expected_and_Risk Result = new Expected_and_Risk(size)// size is 10 in example; 
+0

爲什麼要使用單獨的'Initialize'方法而不是像正常那樣在構造函數中執行它? –

+0

一般來說,如果ctor超出8-10行,我更喜歡不同的方法,並在ctor中調用它。這裏並不要求/建議將Initialize方法公開。當數據需要重置時,我創建公共Initialize,Clear方法。 – Tilak

+0

但是有一個單獨的公共Initialize方法正是你的答案建議。在調用構造函數之後,對象沒有完全初始化,這從來就不是一個好的情況,在這裏完全沒有根據。 –

2

你需要在你的類添加一個Constructor並在構造函數可以定義大小,你的財產

public class Expected_and_Risk 
{ 
//......//your code here 
    public Expected_and_Risk() 
     { 
     this.Prop = new decimal[10]; // this will define an array of 10 decimal elements for Prop 
     } 
} 

也瞭解面向對象編程,還檢查了這篇文章An Intro to Constructors in C#

2

此刻,你已經有了陣列Expected_and_Risk,但你從來沒有初始化的變量。您可以一個構造函數中這樣做:

public Expected_and_Risk(int count) 
{ 
    Name = new string[count]; 
    ... 
} 

...但我認爲實際上是一個討厭的設計。任何時候你有很多收藏品,都具有相同的計數,其中x[0]對應y[0]z[0]等,你應該考慮一個收集代表這些屬性的封裝一個自定義類型。例如:

// Must be an int, not a decimal - you can't create an array with a decimal count 
int count = abc.Forecast.Count(); 

// Note: rename type to follow .NET naming conventions 
Expected_and_Risk[] results = new Expected_and_Risk[count]; 
for (int i = 0; i < count; i++) 
{ 
    results[i].Name = abc[i].Name; 
    ... 
} 

...除了當然現在abc也是一個數組。 (目前尚不清楚你是否真的只是試圖複製這裏的所有值,或者你是否有涉及的業務邏輯,有更好的複製值的方法。)

或者,如果你真的想要在Expected_and_Risk內收集,您可能需要考慮使用List<T>而不是陣列。這樣你就不需要預先指定計數。

+0

...如果Expected_and_Risk將在生產代碼真正的公共類,必須有收藏而不是List 。 – Dennis

+0

@丹尼斯:唔,不......列表'沒什麼錯。你可以選擇聲明變量爲'IList ',同時使用'List '作爲具體類,但我沒有理由在這裏使用'Collection '。 'Collection '被設計成一個* base *類,沒有任何跡象表明集合在這裏需要任何額外的行爲。 –

+0

列表不允許在修改集合(添加/刪除)時更改行爲。例如,如果Expected_and_Risk的開發者被要求添加事件,那麼當插入成員時,他會強制中斷公共合同。在收集的情況下,他將僅更改實現細節。 – Dennis

相關問題