gpt4 book ai didi

c# - 你能在 C# 中定义一个预先指定大小的数组吗?

转载 作者:行者123 更新时间:2023-11-30 13:21:52 25 4
gpt4 key购买 nike

我在这里尝试做的事情应该通过下面的代码显而易见

public class RangeInfo
{
public int[2] Range { set; }
public string Text { set; }
}

public readonly RangeInfo[4] Ranges = new RangeInfo[4] {
new RangeInfo { Range = new int[2] {Int32.MinValue,70}, Text = "..." },
new RangeInfo { Range = new int[2] {70,80}, Text = "..." },
new RangeInfo { Range = new int[2] {80,90}, Text = "..."},
new RangeInfo { Range = new int[2] {90,Int32.MaxValue}, Text = "..." }
};

但是我遇到了很多错误,比如

Array size cannot be specified in a variable declaration

public int[2] 上,

Expected, class, delegate, enum or struct

关于 RangeInfo[4]

我做错了什么?

最佳答案

数组长度不是类型签名的一部分,因此长度为 2 的数组的类型与长度为 3 的数组的类型相同。唯一的类型是 int[] 含义任意长度的 int 数组。

如果您来自 C++,这可能会让您感到困惑,在 C++ 中数组可以是“内联”引用。在 C# 数组中,就像其他引用类型通常(除非明确告知为 stackalloc)分配堆,因此您的变量只是指向堆上数组的指针。

如果你想限制大小,你需要在属性的 setter 中限制它(或者最好是 - 在你的类的构造函数中,从那时起你可以使类不可变)。

public class RangeInfo
{
public RangeInfo(IList<int> range, string txt)
{
if (range == null || range.Count != 2)
throw new ArgumentException(..);
Range = range.ToArray();
Info = txt;
}
public int[] Range { get; private set; }
public string Info { get; private set; }
}

但是,对于这种类型的构造,我宁愿只将两个整数传递给构造函数,并有两个整数字段(这样你就不必堆分配数组)。你也可以使用元组或声明一个 int 对类。您仍然可以通过返回 new[]{a,b} 将两个内部 int 字段公开为数组。

顺便说一句:C# 中确实存在固定大小的数组,但主要用于互操作。声明这样的结构以调用一些需要 64 个连续 32 位整数的 C API 是非常愚蠢的:

struct FooStruct
{
int int0;
int int1;
..
int int63;
}

因此可以创建一个 fixed int[64] 来模拟上面的内容。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct FooStruct
{
fixed int[64] data;
}

关于c# - 你能在 C# 中定义一个预先指定大小的数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com