c# - 如何在 C# 中创建一个包含数组但不使用堆的结构?
问题描述
我需要的:
- 具有任意数量顶点(或至少最多
max
顶点数量)的多边形 - 它应该是一个结构,以便它可以快速并且可以按值分配/传递
似乎我不能使用数组或集合来存储顶点,因为那样我的多边形结构将指向堆上的对象,并且当一个多边形按值分配给另一个多边形时,只会执行浅拷贝,我会有两个多边形都指向同一个顶点数组。例如:
Polygon a = new Polygon();
Polygon b = a;
// both polygons would be changed
b.vertices[0] = 5;
那么我如何创建一个可以具有任意数量(或某个固定数量)顶点但根本不使用堆的结构?
我可以使用很多变量v1, v2, v3 ... v10
等,但我想或多或少地保持我的代码干净。
解决方案
您可以选择使用fixed
关键字定义数组,将其放入堆栈。
但是您不能直接访问数组的元素,除非您在unsafe
上下文中并使用指针。
要获得以下行为:
static void Main(string[] args)
{
FixedArray vertices = new FixedArray(10);
vertices[0] = 4;
FixedArray copy = vertices;
copy[0] = 8;
Debug.WriteLine(vertices[0]);
// 4
Debug.WriteLine(copy[0]);
// 8
}
然后使用以下类定义:
public unsafe struct FixedArray
{
public const int MaxSize = 100;
readonly int size;
fixed double data[MaxSize];
public FixedArray(int size) : this(new double[size])
{ }
public FixedArray(double[] values)
{
this.size = Math.Min(values.Length, MaxSize);
for (int i = 0; i < size; i++)
{
data[i] = values[i];
}
}
public double this[int index]
{
get
{
if (index>=0 && index<size)
{
return data[index];
}
return 0;
}
set
{
if (index>=0 && index<size)
{
data[index] = value;
}
}
}
public double[] ToArray()
{
var array = new double[size];
for (int i = 0; i < size; i++)
{
array[i] = data[i];
}
return array;
}
}
有几件事需要考虑。以上需要用
unsafe
option编译。也是MaxSize
一个常数,并且所需的存储量不能超过这个值。我正在使用索引器this[int]
来访问元素(而不是字段),并且还有一种方法可以使用ToArray()
. 构造函数也可以采用本机数组,或者它将使用空数组来初始化值。这是为了确保new FixedArray(10)
例如将在固定数组中初始化至少 10 个值(而不是未定义,因为它是默认值)。
fixed
从 Microsoft阅读有关此用法的更多信息或搜索C# Fixed Size Buffers
.
堆数组字段
struct StdArray { int[] vertices; Foo(int size) { vertices = new int[size]; } }
堆栈数组字段
unsafe struct FixedArray { fixed int vertices[100]; int size; Foo(int size) { this.size = size; // no initialization needed for `vertices` } }
推荐阅读
- ubuntu - 在 localhost (Ubuntu14.1) 中使用 NGINX 服务器托管多个网站
- corda - 在corda的api文件中状态为散列的值的类型是什么?
- javascript - 无法将属性读取为未定义的小写
- ios - 科尔多瓦应用程序中缺少框架的 Info.plist 文件
- python - 带有大型数据集的 Python 中的不安绘图
- asp.net-core - Swagger 在本地给出 403 错误
- php - 如何获取/打印实体引用的路径或 URL 到我的树枝模板(Drupal 8)?
- kubernetes - kubernetes envFrom:如何加载位于 pod 文件系统文件中的变量
- sql - 当要更新的每一行都是不同的值时如何更新现有表
- android - 将项目导入Android Studio时如何使自动gradle构建静音?