如何在 C# 中初始化结构中的 char 数组我正在这样做
struct cell
{
public char[] domain =new char[16];
public int[] Peers;
public int NumberOfPeers;
public char assignValue;
}
但是它给出的错误是我们无法在结构体中初始化一个数组!谁能告诉正确的方法
如何在 C# 中初始化结构中的 char 数组我正在这样做
struct cell
{
public char[] domain =new char[16];
public int[] Peers;
public int NumberOfPeers;
public char assignValue;
}
但是它给出的错误是我们无法在结构体中初始化一个数组!谁能告诉正确的方法
您可以使用构造函数
struct cell
{
public cell(int charArraySize) : this()
{
domain = new char[arraySize];
}
public char[] domain;
public int[] Peers;
public int NumberOfPeers;
public char assignValue;
}
注意:即使使用结构,也不应该有公共字段,而是将它们封装在属性中。
并且能够改变结构的值是一个更糟糕的问题——可变结构是邪恶的。
.net 中值类型的一个主要限制是它们不能包含数组,即使是固定大小的数组,除非离开托管代码领域(C# 提供了一种使用unsafe
andfixed
关键字在值类型中包含固定大小数组的方法,但是使用该功能的代码在某些安全上下文中将无法使用)。它们可以包含对数组的引用,但如果复制了包含数组引用的结构,则副本将接收到与原始数组相同的引用。
虽然建议在大多数情况下,结构类型最好完全开放它所包含的内容(通过公共字段公开其整个状态),而不是假装是用胶带绑定在一起的变量集合之外的任何东西,其状态应该封装可变类对象(例如 a System.Array
)状态的结构必须使用不同的模式。
如果一个结构应该表现为 64 个浮点数的值类型数组,并且希望实际将浮点数存储在 System.Array 中,而不是存储在 64 个单独的字段中,那么该结构可能应该包含一个私有字段Arr
类型float[]
。要读取元素n
,请检查是否Arr
为空。如果是,则返回零。否则,返回 的值Arr[n]
。要编写 element n
,请将临时变量设置Arr2
为新变量,如果它不为空则float[64]
复制。Arr
然后设置Arr2[n]
为所需的值,并替换Arr
为Arr2
. 请注意,立即将 afloat[]
存储到Arr
,它将永远不会再被写入。如果尝试写入结构的第 5 个元素,该结构将收到一个新数组,其中包含正确的值;旧数组的元素 5 将保持不变。因此,该结构将表现为值类型数组(除了写入它会比写入普通数组慢得多)。
如果一个类型需要一个大数组,最好使用 afloat[][]
或 a float[][][]
; 例如,可以使用 16 个数组中的 16 个数组中的 16 个数组中的 16 个元素来保存 4096 个元素。在这种情况下,写入元素需要生成/复制 a float[16]
、 afloat[16][]
和 a float[16][][]
; 三个大小为 16 的小数组可能优于两个大小为 64 的数组,并且几乎肯定会优于一个大小为 4096 的数组。
值类型语义当然很有用,但如前所述,如果结构包含数组,它们就不能非常有效地提供。如果元素数量很少,另一种设计是简单地为每个元素设置一个字段,并让索引属性访问器使用 switch 语句来读取或写入结构字段。有点恶心,但对于小于十几个元素的结构,它几乎肯定会比使用上述数组更有效。
您可以(并且可能应该)使用类而不是结构(尽管它有所不同,但您不知道您将如何使用您的类型)。
或者你可以写一个构造函数。但请注意,结构实例构造函数必须至少接受一个参数。
如果您坚持使用该结构,请确保将其设为不可变结构。这样做的一种方法是创建所有字段readonly
,然后在您的实例构造函数中分配给它们。
您可以constructor
为此使用 a 。看看 MSDN。
struct cell
{
public cell(int size)
{
domain = new char[size];
this.Peers = Peers;
this.NumberOfPeers = NumberOfPeers;
this.assignValue = assignValue;
}
}
尝试使用这样的东西:
[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];
}
..........
..........
}
请参阅此问题的第一条评论
C# array within a struct
Fixed Size Buffers - msdn.microsoft.com/en-us/library/zycewsya.aspx
这对我有用
专门针对 char[] ;
有点奇怪,我们在处理字符数组时遇到了这么多困难,当我们可以轻松地添加一个字符串时......无论如何这只是一个 char[]......具有您需要的所有索引功能。
无论如何,这对我有用。