簡體   English   中英

如何在C#中聲明一個對象數組

[英]How to declare an array of objects in C#

我有一個非常開始的 C# 問題。 假設我有一個名為GameObject的類,我想創建一個GameObject實體數組。 我可以考慮編寫如下代碼:

GameObject[] houses = new GameObject[200];

編譯器抱怨(假設是因為語法無效)。 由於這是 XNA 開發,我在LoadContent()方法中加載我的紋理,如下所示:

 houses[0].Model = Content.Load<Model>("Models\\Building_01 Windowed");

其中houses[0]應該是一個GameObject並且可以像這樣加載,但是編譯器會拋出這個錯誤:

“使用“new”關鍵字創建對象實例”

“在調用方法之前檢查以確定對象是否為空”

我的初始化肯定有問題。

這里的問題是,您已經初始化了數組 ,但尚未初始化其元素 它們都是空的。 因此,如果您嘗試引用houses[0] ,它將為null

這是您可以自己編寫的一個很棒的小助手方法:

T[] InitializeArray<T>(int length) where T : new()
{
    T[] array = new T[length];
    for (int i = 0; i < length; ++i)
    {
        array[i] = new T();
    }

    return array;
}

然后,您可以將houses數組初始化為:

GameObject[] houses = InitializeArray<GameObject>(200);

您正在創建一個空引用數組。 您應該執行以下操作:

for (int i = 0; i < houses.Count; i++)
{
    houses[i] = new GameObject();
}

使用LINQ ,您可以用一行代碼將未初始化的元素數組轉換為創建的對象的新集合。

var houses = new GameObject[200].Select(h => new GameObject()).ToArray();

實際上,您可以為此使用任何其他來源,甚至可以生成整數序列

var houses = Enumerable.Repeat(0, 200).Select(h => new GameObject()).ToArray();

但是,盡管原始序列的類型並不重要,但在我看來第一種情況更具可讀性。

我猜GameObject是引用類型。 引用類型的默認值為null =>您有一個null數組。

您需要分別初始化數組的每個成員。

houses[0] = new GameObject(..);

只有這樣,您才可以訪問對象而不會發生編譯錯誤。

因此,您可以顯式初始化數組:

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

或者您可以將GameObject更改為值類型。

您需要初始化數組的對象元素。

GameObject[] houses = new GameObject[200];

for (int i=0;`i<house` i<houses.length; i++)
{ houses[i] = new GameObject();}

當然,在引用元素之前,可以在其他任何地方使用不同的構造函數有選擇地初始化元素。

您擁有的一切看起來都很好。

我唯一能想到的(沒有看到應該提供的錯誤消息)是GameObject需要默認的(無參數)構造函數。

發生這種情況的原因是,初始化數組不會初始化該數組中的每個元素。 您需要先設置houses[0] = new GameObject() ,然后它才能工作。

對於仍在尋找的人

    Object[] obj = {
        new { key = "key", value = "value"},
        new { key = "key", value = "value"},
        new { key = "key", value = "value"},
        new { key = "key", value = "value"},
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM