C# 中如何以迴圈方式設定 struct 內的陣列的值?(一點通系列 - MVP 撰寫)

文章編號: 2701274 - 檢視此文章適用的產品。

關於作者:

本文由微軟最有價值專家 MVP 李?慶 提供。微軟十分感謝 MVP 主動地將他們的經驗與上百萬名其他技術使用者交流。MVP 李?慶 同時也將此篇文章放在他的部落格內,歡迎您按 此處 瀏覽 MVP 李?慶 更多的技術文章、經驗分享與觀點。
全部展開 | 全部摺疊

問題的來龍去脈

在 C++ 中,若 struct 中的元素包含有陣列,可以使用 for loop 去設定該陣列的值。如以下的程式所示:
struct machine{
????int assignedJobs[12];?
????double completion;?
};

void main(){
????int m = 3,n = 12;?
????for (int i=0; i<m; i++){
??? ??? for (int j=0; j<n; j++){
??? ??? ??? M[i].assignedJobs[j] = 0;
??? ??? }
??? ??? M[i].completion=0;
??? }
}
C# 中卻不能這樣使用?

問題的發生原因

發生的原因在於陣列的宣告方式不正確。在 C# 中,陣列實際上是物件,而不是只像在 C 和 C++ 中可定址的連續記憶體區域而已。

問題的解決方法

1. 在定義結構時,僅定義陣列的型別。
2. 在結構執行個體化之後,再針對陣列執行個體化。
3. 陣列執行個體化之後,就可以對陣列元素設定值。
4. 例如以下的程式範例:(請新增專案時,範本請選主控台應用程式)

using System;

namespace ConsoleApplication1
{
??? class Program
??? {
??? ??? struct machine //定義結構
??? ??? {
??? ??? ??? public int[] assignedJobs; //定義成員 assignedJobs。其型別為 一維整數陣列,預設值為 null 參考
??? ??? ??? public double completion; //定義成員 completion。其型別為 倍精確度浮點數,預設值為 0
??? ??? }

??? ??? static void Main(string[] args)
??? ??? {
??? ??? ??? machine[] Machine = new machine[3];
??? ??? ??? for (int i = 0; i < Machine.Length; i++)
??? ??? ??? {
??? ??? ??? ??? //宣告陣列大小並設定元素值
??? ??? ??? ??? Machine[i].assignedJobs = new int[12];
??? ??? ??? ??? for (int j = 0; j < Machine[i].assignedJobs.Length; j++)
??? ??? ??? ??? {
??? ??? ??? ??? ??? Machine[i].assignedJobs[j] = i * 100 + j;
??? ??? ??? ??? }
??? ??? ??? ??? /*
?????????????????* 你也可以這樣作
?????????????????* int j = i * 100;
??????? ?????????* Machine[i].assignedJobs = new int[12] { j, j + 1, j + 2, j + 3, j + 4, j + 5, j + 6, j + 7, j + 8, j + 9, j + 10, j + 11 };
??????? ?????????*?
??????? ?????????* 或是這樣作
??????? ?????????* int j = i * 100;
??????? ?????????* Machine[i].assignedJobs = new int[] { j, j + 1, j + 2, j + 3, j + 4, j + 5, j + 6, j + 7, j + 8, j + 9, j + 10, j + 11 };
??????? ?????????*/
??????? ?????????Machine[i].completion = i + 1;
??????? ???}

??????? ???//輸出結果
??????? ???foreach (machine MachineItem in Machine)
??????? ???{
??????? ????Console.WriteLine("-------------------------------------------------------------------------------");
??????? ????????Console.Write(string.Format("Completion:{0: 00} and assignedJobs:", MachineItem.completion));
??????? ????????foreach (int jobs in MachineItem.assignedJobs)
??????? ???????{
??????? ??????? ???Console.Write(String.Format("{0:D3}", jobs).PadRight(4));
??????? ???????}
??????? ??????Console.WriteLine();
??????? ??}
??????? ??Console.Read();
??????? }
??}
}


5. 就會得到這樣的結果畫面:


摺疊此圖像展開此圖像
輸出結果



其他相關資訊

請讓我們知道

摺疊此表格展開此表格
摺疊此圖像展開此圖像
請讓我們知道
還滿意我們寫的內容嗎?無論您是遇到了以下任何一種情況:
「太好了!問題解決了。」
「問題沒有解決,我有更好的建議。」
都歡迎您利用本篇文章底部的意見調查表,寫下您寶貴的意見。也期待您的鼓勵,讓我們為您創造更多實用的技術文章。

屬性

文章編號: 2701274 - 上次校閱: 2014年5月19日 - 版次: 1.3
這篇文章中的資訊適用於:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2010 Express
關鍵字:?
kbprb kbtshoot kbstepbystep kbgraphxlink kbmvp kbexpertisebeginner KB2701274
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com