Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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/3/arrays/14.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#将扩展追加方法添加到T类型的类数组中_C#_Arrays_Generics_Append_Extension Methods - Fatal编程技术网

C#将扩展追加方法添加到T类型的类数组中

C#将扩展追加方法添加到T类型的类数组中,c#,arrays,generics,append,extension-methods,C#,Arrays,Generics,Append,Extension Methods,用这个来回答问题“”我试图用它来编写一个泛型扩展,将元素附加到。只有使用该方法才能很好地工作,下面的示例为我的 但是,当我尝试使用下面描述的ArrayExtension方法时,该方法确实会在该方法中调整我的数组大小,但是当它返回数组时,数组是否保持不变 我的扩展课 public static class ArrayExtensions { public static void Append<T>(this T[] array, T append) {

用这个来回答问题“”我试图用它来编写一个泛型扩展,将元素附加到。只有使用该方法才能很好地工作,下面的示例为我的

但是,当我尝试使用下面描述的ArrayExtension方法时,该方法确实会在该方法中调整我的数组大小,但是当它返回数组时,数组是否保持不变

我的扩展课

public static class ArrayExtensions
{
    public static void Append<T>(this T[] array, T append)
    {
        Array.Resize(ref array, array.Length + 1);
        array[array.Length - 1] = append;    // < Adds an extra element to my array
    }
}
当方法返回时,添加的元素不存在。我错过了什么

更新

正如所指出的,这个问题以前在这里被提出并得到了回答。我接受上一个问题“”作为对我问题的回答

更新2

由于如果在扩展方法中使用了返回方法,那么它确实违反了框架中类似类的预期行为,即Append()修改对象本身,因此我对扩展方法做了一些更改,以防止错误使用它。感谢@NineBerry指出这一点

我还添加了允许同时添加多个元素

public static class ArrayExtensions
{
    /// <summary>
    /// Creates a copy of an object array and adds the extra elements to the created copy
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="array"></param>
    /// <param name="add">Elemet to add to the created copy</param>
    /// <returns></returns>
    public static T[] CopyAddElements<T>(this T[] array, params T[] add)
    {
        for (int i = 0; i < add.Length; i++)
        {
            Array.Resize(ref array, array.Length + 1);
            array[array.Length - 1] = add[i];
        }
        return array;
    }
}
公共静态类ArrayExtensions
{
/// 
///创建对象数组的副本,并将额外的元素添加到创建的副本中
/// 
/// 
/// 
///要添加到已创建副本的元素
/// 
公共静态T[]CopyAddElements(此T[]数组,参数T[]add)
{
for(int i=0;i
用法

string[]数组=新字符串[]{“Foo”,“Bar”};
array=array.CopyAddElements(“Baz”、“Foobar”);
for(int i=0;i
数组。调整大小
创建一个新数组。这就是为什么必须使用
ref
关键字将数组传递到
array.Resize
。因此,从
Array.Resize
返回后,变量
Array
引用不同的对象

没有办法使用扩展方法来完成您要做的事情


为什么不简单地使用列表而不是数组呢?使用
Array.Resize
是一项非常昂贵的操作。这意味着每次调用新数组时,都要分配新内存并将数据从旧数组复制到新数组,以增加数组长度

数组。调整大小
创建一个新数组。这就是为什么必须使用
ref
关键字将数组传递到
array.Resize
。因此,从
Array.Resize
返回后,变量
Array
引用不同的对象

没有办法使用扩展方法来完成您要做的事情


为什么不简单地使用列表而不是数组呢?使用
Array.Resize
是一项非常昂贵的操作。这意味着每次调用新数组时,都要分配新内存并将数据从旧数组复制到新数组,以增加数组长度

与您的直觉相反,
参数不是通过隐式的
ref
传递的,也不允许向其添加
ref
。另请参见讨论

与您的直觉相反,
参数未通过隐式
ref
传递,也不允许向其添加
ref
。另请参见讨论

实际发生的情况是

array.Append("Baz");
翻译成

ArrayExtensions.Append( array, "Baz" );
这意味着对
array
的引用是通过value传入的,因此在
Append
方法中,您使用引用的副本。然后,
Array.Resize
方法将这个新变量作为
ref
,在内存中创建一个新数组,并将变量更改为指向它。不幸的是,此仅更改此变量,而不是原始变量


您可以将新创建的数组作为返回值返回,也可以创建一个使用
ref
而不是扩展方法的静态方法。

实际情况是

array.Append("Baz");
翻译成

ArrayExtensions.Append( array, "Baz" );
这意味着对
array
的引用是通过value传入的,因此在
Append
方法中,您使用引用的副本。然后,
Array.Resize
方法将这个新变量作为
ref
,在内存中创建一个新数组,并将变量更改为指向它。不幸的是,此仅更改此变量,而不是原始变量


您可以将新创建的数组作为返回值返回,也可以创建一个使用
ref
而不是扩展方法的静态方法。

请将建议
List
作为答案的第一句话。这才是真正的解决办法。请在回答的第一句话中列出建议。这才是真正的解决方案。Array.Resize是一个骗局。它实际上是一个新对象的副本。因此,您需要一个ref参数来影响实际参数。Array.Resize是一个骗局。它实际上是一个新对象的副本。从这里可以看出,您需要一个ref参数来对实际参数产生影响。
ArrayExtensions.Append( array, "Baz" );