5

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

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

但是它给出的错误是我们无法在结构体中初始化一个数组!谁能告诉正确的方法

4

7 回答 7

10

您可以使用构造函数

struct cell
{
    public cell(int charArraySize) : this()
    {
         domain = new char[arraySize];
    }

    public char[] domain;
    public int[] Peers;
    public int NumberOfPeers;
    public char assignValue;
}

注意:即使使用结构,也不应该有公共字段,而是将它们封装在属性中。

并且能够改变结构的值是一个更糟糕的问题——可变结构是邪恶的

于 2012-12-17T13:44:26.013 回答
3

.net 中值类型的一个主要限制是它们不能包含数组,即使是固定大小的数组,除非离开托管代码领域(C# 提供了一种使用unsafeandfixed关键字在值类型中包含固定大小数组的方法,但是使用该功能的代码在某些安全上下文中将无法使用)。它们可以包含对数组的引用,但如果复制了包含数组引用的结构,则副本将接收到与原始数组相同的引用。

虽然建议在大多数情况下,结构类型最好完全开放它所包含的内容(通过公共字段公开其整个状态),而不是假装是用胶带绑定在一起的变量集合之外的任何东西,其状态应该封装可变类对象(例如 a System.Array)状态的结构必须使用不同的模式。

如果一个结构应该表现为 64 个浮点数的值类型数组,并且希望实际将浮点数存储在 System.Array 中,而不是存储在 64 个单独的字段中,那么该结构可能应该包含一个私有字段Arr类型float[]。要读取元素n,请检查是否Arr为空。如果是,则返回零。否则,返回 的值Arr[n]。要编写 element n,请将临时变量设置Arr2为新变量,如果它不为空则float[64]复制。Arr然后设置Arr2[n]为所需的值,并替换ArrArr2. 请注意,立即将 afloat[]存储到Arr,它将永远不会再被写入。如果尝试写入结构的第 5 个元素,该结构将收到一个新数组,其中包含正确的值;旧数组的元素 5 将保持不变。因此,该结构将表现为值类型数组(除了写入它会比写入普通数组慢得多)。

如果一个类型需要一个大数组,最好使用 afloat[][]或 a float[][][]; 例如,可以使用 16 个数组中的 16 个数组中的 16 个数组中的 16 个元素来保存 4096 个元素。在这种情况下,写入元素需要生成/复制 a float[16]、 afloat[16][]和 a float[16][][]; 三个大小为 16 的小数组可能优于两个大小为 64 的数组,并且几乎肯定会优于一个大小为 4096 的数组。

值类型语义当然很有用,但如前所述,如果结构包含数组,它们就不能非常有效地提供。如果元素数量很少,另一种设计是简单地为每个元素设置一个字段,并让索引属性访问器使用 switch 语句来读取或写入结构字段。有点恶心,但对于小于十几个元素的结构,它几乎肯定会比使用上述数组更有效。

于 2012-12-17T23:19:28.467 回答
2

您可以(并且可能应该)使用类而不是结构(尽管它有所不同,但您不知道您将如何使用您的类型)。

或者你可以写一个构造函数。但请注意,结构实例构造函数必须至少接受一个参数。

如果您坚持使用该结构,请确保将其设为不可变结构。这样做的一种方法是创建所有字段readonly,然后在您的实例构造函数中分配给它们。

于 2012-12-17T13:47:06.440 回答
1

您可以constructor为此使用 a 。看看 MSDN。

struct cell
{
    public cell(int size)
    {
         domain = new char[size];
         this.Peers = Peers;
         this.NumberOfPeers = NumberOfPeers;
         this.assignValue = assignValue;
    }    
}
于 2012-12-17T13:45:56.100 回答
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];

}

..........

..........

}
于 2012-12-17T13:49:41.467 回答
1

请参阅此问题的第一条评论
C# array within a struct
Fixed Size Buffers - msdn.microsoft.com/en-us/library/zycewsya.aspx
这对我有用

于 2014-09-22T15:07:28.140 回答
0

专门针对 char[] ;

有点奇怪,我们在处理字符数组时遇到了这么多困难,当我们可以轻松地添加一个字符串时......无论如何这只是一个 char[]......具有您需要的所有索引功能。

无论如何,这对我有用。

于 2019-07-14T09:21:50.237 回答