如何在C#中初始化结构中的char数组我正在做这个
struct cell
{
public char[] domain =new char[16];
public int[] Peers;
public int NumberOfPeers;
public char assignValue;
}
但它给出的错误是我们无法初始化结构体中的数组!任何人都能说出正确的方法
答案 0 :(得分:9)
您可以使用构造函数
struct cell
{
public cell(int charArraySize) : this()
{
domain = new char[arraySize];
}
public char[] domain;
public int[] Peers;
public int NumberOfPeers;
public char assignValue;
}
注意:即使使用结构,也不应该有公共字段,而是将它们封装在属性中。
能够更改 结构的值是一个更糟糕的问题 - mutable structs are evil。
答案 1 :(得分:2)
你可以(并且可能应该)使用一个类而不是一个结构(尽管它有所不同,但是你没有告诉你将如何使用你的类型)。
或者你可以写一个构造函数。但请注意,struct实例构造函数必须至少包含一个参数。
如果您坚持使用结构,请确保使其成为不可变结构。一种方法是创建所有字段readonly
,然后在实例构造函数中为它们分配。
答案 2 :(得分:2)
.net中值类型的一个主要限制是它们不能包含数组,即使是固定大小的数组,除非有一个离开托管代码领域(C#提供了一种使用{在值类型中包含固定大小的数组的方法) {1}}和unsafe
个关键字,但使用该功能的代码在某些安全上下文中将无法使用。它们可以包含对数组的引用,但如果复制了包含数组引用的结构,则副本将接收与原始数组相同的数组的引用。
虽然会建议在大多数情况下,结构类型对于它包含的内容(通过公共字段公开其整个状态)是完全开放的,而不是假装除了绑定在一起的变量集合之外的其他任何东西。 duct tape,一个结构,其状态应该封装一个可变类对象的状态(例如fixed
)必须使用不同的模式。
如果一个struct应该表现为64个浮点数的值类型数组,并且希望实际上将浮点数存储在System.Array而不是64个单独的字段中,那么该结构应该包含一个私有字段{类型为System.Array
的{1}}。要读取元素Arr
,请检查float[]
是否为空。如果是,则返回零。否则,返回n
的值。要编写元素Arr
,请将临时变量Arr[n]
设置为新n
,如果不是空,则复制Arr2
。然后将float[64]
设置为所需的值,并将Arr
替换为Arr2[n]
。请注意,Arr
已经存储到Arr2
,它将永远不会被写入。如果尝试写入结构的元素5,结构将接收一个具有适当值的新数组;旧数组的元素5将不受影响。因此,结构将表现为值类型数组应该(除了写入它将比写入普通数组要慢得多)。
如果某个类型需要大型数组,最好使用float[]
或Arr
;例如,一个人可能使用包含16个16个16个元素阵列的16个阵列的阵列来容纳4096个元素。在这种情况下,写入元素需要生成/复制float[][]
,float[][][]
和float[16]
;大小为16的三个小数组可能比两个大小为64的数组更好,几乎肯定会比一个大小为4096的数组更好。
值类型语义肯定是有用的,但是如果它们包含数组,结构不能提供非常有效的结构。如果元素的数量很少,则另一种设计是简单地为每个元素设置一个字段,并且具有索引属性访问器,使用switch语句来读取或写入struct字段。有点icky,但对于小于十几个元素的结构,它几乎肯定比使用如上所述的数组更有效。
答案 3 :(得分:1)
您可以使用constructor
。看看MSDN。
struct cell
{
public cell(int size)
{
domain = new char[size];
this.Peers = Peers;
this.NumberOfPeers = NumberOfPeers;
this.assignValue = assignValue;
}
}
答案 4 :(得分:1)
尝试使用类似的东西:
[StructLayout(LayoutKind.Sequential)]
public class TCardDB
{
public TCardDB(string strCardNo)
{
CardNo = strCardNo;
FName = LName = string.Empty;
OpenMode = FingerCount = 0;
Finger1 = new string[3];
Finger2 = new string[3];
}
..........
..........
}
答案 5 :(得分:1)
见这个问题的第一条评论
C# array within a struct
固定大小缓冲区 - msdn.microsoft.com/en-us/library/zycewsya.aspx
这对我来说是个窍门
答案 6 :(得分:0)
专门针对char [];
当我们可以轻松地添加字符串时,我们在处理字符数组时遇到了很多困难,这有点奇怪。 反正这只是一个char [] ... 拥有您所需的所有索引功能。
无论如何对我有用。