Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理结构内部的数组?_C# - Fatal编程技术网

C# 如何处理结构内部的数组?

C# 如何处理结构内部的数组?,c#,C#,我正在寻找一种方法,在我的项目中用数组替换一些列表对象,以提高性能。原因是我要替换的列表不会经常改变大小(有时只改变一次),所以用数组替换它们是有意义的。另外,我希望尽可能防止堆上的分配 所以我的想法是创建一个包含两个成员“Count”和“Array”的结构(ArrayStruct)。该结构将有一些函数来添加/删除/获取/设置/等等。。。数组中的元素。计数将保持数组中可用元素的计数,并且数组的大小只会增加,而不会减少。 请注意,这是一个非常特殊的情况,因为我知道数组大小不会很大 我遇到的主要问题

我正在寻找一种方法,在我的项目中用数组替换一些列表对象,以提高性能。原因是我要替换的列表不会经常改变大小(有时只改变一次),所以用数组替换它们是有意义的。另外,我希望尽可能防止堆上的分配

所以我的想法是创建一个包含两个成员“Count”和“Array”的结构(ArrayStruct)。该结构将有一些函数来添加/删除/获取/设置/等等。。。数组中的元素。计数将保持数组中可用元素的计数,并且数组的大小只会增加,而不会减少。 请注意,这是一个非常特殊的情况,因为我知道数组大小不会很大

我遇到的主要问题是,当我将对已经存在的ArrayStruct对象(示例中名为a)的引用传递给另一个对象(示例中名为b)时,我可以在其中编辑数组,但在a中调整数组大小后,在b中会出现超出范围的异常。这是因为我通过
System.Array.Resize
更新引用的方式,使得对象b不知何故不将此更改归为属性吗

作为一个想法,我唯一能想到的就是试图重写赋值运算符,这样它就可以在赋值时创建一个新数组。。。但显然,这是行不通的

我的阵列结构

公共结构ArrayStruct
{
[SerializeField]专用整数m_计数;
[SerializeField]专用T[]m_数组;
公共整数计数=>m_计数;
公共void初始化(int startSize)
{
m_计数=0;
m_数组=新的T[startSize];
}
公共T GetAt(整数索引)
{
返回m_数组[索引];
}
public void SetAt(int index,T newValue)
{
m_数组[索引]=新值;
}
公共无效添加(T新元素)
{
if(m_数组==null){
m_数组=新的T[1];
}else if(m_Array.Length==m_Count){
System.Array.Resize(参考m_数组,m_计数+1);
}
m_数组[m_计数]=新元素;
m_Count++;
}
公共无效删除(T元素)
{
对于(int i=0;i
一个例子说明了这个问题

var a=新的ArrayStruct()
a、 加上(“你好”);
var b=a;
打印(b.GetAt(0));/“您好”
a、 SetAt(0,“a的新值”);
打印(b.GetAt(0));/“a的新值”,更改a更改了b因为数组在两者中相同,这是错误的
a、 添加(“调整数组大小”);
打印(b.GetAt(1));/“超出范围异常”,因为数组的大小是针对a调整的,而不是针对b调整的,因此连接中断
那么,当我将结构赋值给另一个变量时,你们中有人知道如何创建数组的新副本吗? 当然,我知道我可以用一个函数来做这样的事情 b=新阵列结构(a); 但我希望它是含蓄的,或者如果有一种方法可以阻止同样适合我的任务。 var a=new arraystuct();//让它工作 var b=a;//防止这种情况发生

如果您有任何其他解决方案可以方便地用数组替换列表,请告诉我

当我把结构赋值给另一个变量时,你们中有人知道我怎样才能在数组中创建一个新的副本吗?当然,我知道我可以用一个函数来做一些事情,比如So b=new arraystuct(a);但我希望它是隐式的

你不能这样做。如果
a
是一个结构,并且你执行
var b=a
,那么它将始终,只需将
b
设置为
a
的浅层副本;无法更改该行为


执行类似于
b=newarraystuct(a)
的操作是最好的选择。

您不理解“=”操作符在那里做什么。对象是通过引用定义的,这意味着当您编写
var b=a;
时,您实际上是在请求您希望避免发生的事情,即对象“b”,指向同一对象,即“a”。 您正在传递对象“b”以指向对象“a”的引用,该对象包含您定义的对象的地址,使用
new
关键字
var a=new arraystuct()

运算符重载不起作用,因为您不能将其用于与编写运算符的类相同类型的转换。您必须创建一个单独的对象(类),这将破坏您试图修复的点,或者传递m_数组:
公共静态隐式运算符ArrayStruct(t[]数组)

您也可以这样做:

        public static ArrayStruct<T> CopyFrom (ArrayStruct<T> array)
    {
        var newArray = new ArrayStruct<T>();
        newArray.m_Array = new T[array.Count + 1];
        newArray.Count = array.Count;
        Array.Copy(array.m_Array, 0, newArray.m_Array, 0, array.m_Array.Length);
        return newArray;
    }
公共静态ArrayStruct CopyFrom(ArrayStruct数组)
{
var newArray=newarraystuct();
newArray.m_Array=newt[Array.Count+1];
newArray.Count=array.Count;
复制(Array.m_Array,0,newArray.m_Array,0,Array.m_Array.Length);
返回新数组;
}
现在它应该完全按照你的要求工作

    var a = new ArrayStruct<string>();
    a.Add("hello");
    var b = ArrayStruct<string>.CopyFrom(a);

    a.SetAt(0, "new value for a");


    a.Add("resizing array");

    Console.WriteLine(b.Count); // b returns 1
    Console.WriteLine(a.Count); // a returns 2
var a=新的ArrayStruct();
a、 加上(“你好”);
var b=ArrayStruct.CopyFrom(a);
a、 设定值(0),新值