【发布时间】:2013-10-27 04:33:37
【问题描述】:
我正在将一个用 Pascal 编写的游戏(以 16 位编译)移植到 C#(因此它将在比 XP 更新的机器上运行)。根据我收集到的信息,在 Pascal 中,可以通过如下语法在单元/程序的类型部分中键入定义:
type
BaseArrayPtr = ^BaseArray;
BaseArray = array [1 .. 5, 1 .. 5] of Integer;
SubArray = array [0 .. 3] of BaseArray;
我还了解到,不幸的是,无法在 C# 中键入定义。但是,我正在尝试解决方法。到目前为止,这就是我所拥有的:
BoundedArray.cs:
using System;
using System.Collections;
namespace test
{
abstract class BoundedArray<T>
{
public BoundedArray()
{
m_data = null;
}
public T this[params int[] index]
{
get
{
if (index.Length != m_data.Rank)
throw new IndexOutOfRangeException();
return (T) m_data.GetValue(index);
}
set
{
if (index.Length != m_data.Rank)
throw new IndexOutOfRangeException();
m_data.SetValue(value, index);
}
}
protected void SetAttributes(int[] lowerBounds, int[] lengths)
{
if (lengths.Length != lowerBounds.Length)
throw new ArgumentException();
m_lowerBounds = lowerBounds;
m_lengths = lengths;
m_data = Array.CreateInstance(typeof(T), m_lengths, m_lowerBounds);
m_data.Initialize(); // Should (but doesn't) initialize every element in m_data
}
Array m_data;
int[] m_lengths;
int[] m_lowerBounds;
}
}
test.cs:
using System;
namespace test
{
class Program
{
public static int[] ints(params int[] values)
{
return values;
}
class BaseArray : BoundedArray<int>
{
public BaseArray()
{
SetAttributes(ints(2, 2), ints(1, 2));
}
}
class SubArray : BoundedArray<BaseArray>
{
public SubArray()
{
SetAttributes(ints(4), ints(2));
}
}
static void Main(string[] args)
{
SubArray subArray = new SubArray();
Console.Read();
}
}
}
我检查了baseArray,m_data 的默认值为零,因为它们是ints。但是,在subArray 中,m_data 的默认值为 null - subArray 中数组内的 BaseArray 实例由于某种原因尚未初始化。如何让默认构造函数运行?
编辑:目前真正的问题是为什么m_data.Initialize(); 方法中的SetAttributes 不初始化m_data 中的所有元素? The documentation on MSDN 似乎表明它应该...
编辑:
所以我认为问题在于System.Array.Initialize 仅适用于值类型。由于类是 C# 中的引用类型,System.Array.Initialize 不做任何事情。所以我必须找到一种方法来初始化一个可变维度、长度和下界的引用类型数组。
【问题讨论】:
-
您尝试了什么?找到解决方案了吗
-
不,我还没有找到解决方案。
System.Array.Initialize的文档似乎表明它应该完全满足我的需要,但正如你所见,我把它放在那里,但它什么也没做......