2011-03-10 56 views
3

我是C#的新手,通常是C程序員,所以我很難找出最佳方法來使用。希望我能得到一些建議來幫助我做出決定。
我有一個看起來像這樣(我這樣做我會怎麼做它在C)的結構:當結構包含一個數組/列表時創建一個數組/列表結構

struct structData 
{ 
    long type; 
    long myArray[50]; 
    string text; 
} 

我創建這些結構的,我可以連續讀/寫全局/公開的數組。 (我需要將數據存儲在那裏,因此它可以在以後的時間被訪問)

structData arrayOfStructs[50]; 

的目標將是訪問這樣的數據:

arrayOfStructs[0].type = 123; 
arrayOfStructs[0].myArray[0] = 456; 

當我嘗試實施這在C#中,我收到了各種各樣的錯誤:
myArray」需要固定爲50,但它需要在不安全區域
如果我嘗試初始化它「... = new ...」我得到一個錯誤

首先,我應該使用列表<>而不是數組嗎?是否有性能差異?
其次,我應該創建一個類而不是一個結構,在構造函數中初始化該數組,然後創建一個對象的列表/數組?你將如何實現這一點?
是的,我需要使用多頭。

+0

發佈代碼的其餘部分,包括您的數組的初始化 – smartcaveman 2011-03-10 19:51:11

+5

僅僅因爲語法相似並不意味着您應該在C#中編寫C代碼。 – ChaosPandion 2011-03-10 19:52:35

+1

我不想在C#中編寫C語句我只是在說我會如何在C中完成它,而不是我應該做的事情。這就是爲什麼我問我該怎麼做。 – 2011-03-10 20:23:07

回答

4
public class StructData 
{ 
    public long type; 
    public long[] myArray = new long[50]; 
    public string text; 
} 

StructData[] datas = new StructData[100]; 

for (int i = 0; i < datas.Length; i++) 
{ 
    datas[i] = new StructData(); 
} 

的大型物體,結構爲小,可能不可改變的「對象」使用類(可以說是結構要小的和不可改變的。他們可以,但是你想) 需要明確的是,最大的結構我知道在.NET中由4個int(它是Guid)組成。我認爲這是一個很好的基準,可以對抗大型結構。

使用列表如果你需要擴大你的集合,如果大小是固定的數組,列表不會比數組慢(它們在內部使用數組)。我不知道是否有人曾經把一個數組作爲一個List的基準。 List通常使用比數組更多的內存,因爲它保留了一點空間來放大集合(並且它保留了List的當前大小和指向內部數組的指針,並且可能還有其他數據。一個int和一個指針,加上所有對象的std開銷)。您可以通過向構造函數傳遞要保留的元素數量來「預設」列表。

+0

當你打敗我吧! – CodingGorilla 2011-03-10 19:55:55

+0

當我嘗試寫入數組時,出現錯誤。我使用這一行:datas [0] .type = 123; – 2011-03-10 20:20:29

+0

@Nick你會得到什麼錯誤?我測試了代碼,沒關係。 – xanatos 2011-03-10 20:31:53

0

如果你需要本地的互操作性,也就是說,你要通過某種機制來編組這些類型,或者簡單地圍繞字節數組進行編譯,那麼你需要這些不安全/固定的東西,它可以這樣完成。

unsafe struct structData 
{  
    int type; 
    fixed int myArray[50]; // long is 64-bit in C# was that intentional? 
    string text; // string is a managed type 
} 

來自C你絕對不應該直接將C代碼直接轉換成C#等價物,因爲這沒什麼意義。在C#中,事物是託管的,您通常會接受與託管代碼相關的成本,並且不會考慮該級別的性能影響,而不是首先考慮。

開始的一個好地方是研究C#的內存模型,因爲它解釋了值類型和引用類型之間的許多細微但重要的差異。

2

所以,讓我先說,你應該避免在C#中編寫C代碼的誘惑。除了明顯的語法相似之外,這兩種語言幾乎沒有共同之處。

在C#中你很少使用結構。結構的語義與類的不同。以下是關於何時使用struct v何時使用類的簡要說明。有更多的資源可用,我只是抓住了第一個碰到這個問題的結果,似乎是合理的:When to use a struct

其次,是的,你應該儘可能使用泛型容器類型。性能不會成爲問題,從長遠來看,它會讓你的生活變得更加輕鬆。您的聲明數組要關閉(它比C是不同的),應該是:

long[] myArray = new long[50]; 

如果您需要在陣列中存儲互操作的目的,您可以通過fixed關鍵字做到這被固定,但互操作無論如何,當你將託管數組傳遞給本地函數時,層實際上會爲你做這件事。

我建議你花一些時間從頭開始學習C#,並忘記語法與C類似的事實。它們是完全不同的語言,具有完全不同的語義和最佳實踐。

相關問題