使用Visual Studios 2010 C#
所以我正在为一个c#项目创建一个数据结构,它的成员中包含一个类型为另一个结构的数组。例如,这里是我的代码的简要概念:
private struct scores
{
public double finalScore;
};
private struct information
{
public string name;
public scores[] scoreList;
};
我写这篇文章时收到以下警告:
错误1'WindowsFormsApplication1.main.information.scoreList':不能 在结构中有实例字段初始值设定项
我想知道什么是正确的方法来声明结构信息的score [] scoreList方面,所以我可以将数组大小设置为10?
我尝试过的事情:
如果我尝试
公共分数[] scoreList =新分数[10]
我收到以下错误
错误1'WindowsFormsApplication1.main.information.scoreList':不能 在结构中有实例字段初始值设定项
答案 0 :(得分:4)
这里的问题是你将结构设为私有,这意味着你不能创建它们的实例。让它们公开。而且还摆脱了;最后
public struct scores
{
public double finalScore;
}
public struct information
{
public string name;
public scores[] scoreList;
}
我通常不使用结构,因为它们的OO限制以及它们不可为空的事实。但是.Net中有几个结构:DateTime,int,float等......
答案 1 :(得分:3)
在结构中,您只能在构造函数中进行初始化:
struct information {
public string name;
public scores[] scoreList;
// Constructor
public information(String nameValue) {
name = nameValue;
scoreList = new scores[10]; // <- It's possible here
}
};
答案 2 :(得分:3)
你不能这样做。原因是结构是值类型。 struct的默认构造函数是一个无参数构造函数,它将所有字段初始化为其默认值。您无法控制此构造函数,因为它们是值类型。
显示此信息的最佳方法是通过一个数组。假设您创建一个类类型的数组,例如new object[10]
。此数组的项目将初始化为null
。但是,当你创建一个结构数组时,例如new information[10]
,数组的项目已经是有效的实例。但是,这些项上的构造函数将不会运行,并且所有字段都将初始化为其空值。在您的情况下,这意味着所有字段都为null
。
这有两个解决方案。第一种解决方案是创建工厂方法,例如:
public static information CreateNew()
{
var result = new information();
result.scoreList = new scores[10];
return result;
}
这会奏效。您只需使用information.CreateNew()
而不是new information()
创建实例,并且您将初始化information
。但是,更简单的解决方案是使用class
代替。
答案 3 :(得分:0)
有三种方法可以使结构表现为值类型的结构数组:
unsafe
代码在您的结构中包含一个或多个fixed
基元数组;让你的索引get / put访问器从存储在那些数组中的信息中组装一个结构。例如,如果您想表现得像Point
数组,则可以为所有fixed
坐标设置X
数组,为所有Y坐标设置fixed
数组,然后让this[int]
getter通过组合Point
和X
值构建Y
,this[int]
setter存储来自的this[int]
和X值传入点。
this[int]
getter,并将get
setter写入其中一个。有一些方法可以使这不是非常低效,但它仍然相当icky。
set
和T[] _array;
T this[int index] {
get {
T[] temp_array = _array;
if (temp_array == null) return default(T);
return temp_array[index];
}
set {
do
{
T[] was_array[] = _array;
T[] new_array = (temp_array == null) ? new T[size] : (T[])(temp_array.Clone());
temp_array[index] = value;
} while (System.Threading.Interlocked.CompareExchange(ref _array, new_array, was_array) !=
was_array);
}};
访问者应该类似于:
set
这种方法将允许get indexer比第二种方法(也可能是第一种方法)更快地运行,并且与第一种方法不同,它将与泛型类型一起使用。这种方法的主要缺点是每次运行{{1}}访问器时,它必须创建一个新的数组副本。但是,如果写入比读取频率低得多,则可能不是问题。顺便提一下,正如所写的那样,代码应该是完全线程安全的 - 这可以通过可变结构实现,但对于假装不可变的结构是不可能的。