如何在struct中初始化char数组

时间:2012-12-17 13:42:53

标签: c# .net arrays struct initialization

如何在C#中初始化结构中的char数组我正在做这个

struct cell
{
    public char[] domain =new char[16];
    public int[] Peers;
    public int NumberOfPeers;
    public char assignValue;
}

但它给出的错误是我们无法初始化结构体中的数组!任何人都能说出正确的方法

7 个答案:

答案 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 [] ... 拥有您所需的所有索引功能。

无论如何对我有用。