C#Array.Resize传递Ref而不是值

时间:2017-03-31 10:10:55

标签: c# arrays

标题可能有点误导

我有一个字符串数组。我希望通过参考传递。

我知道这可以通过

完成
public class test{
    string[] content = {"abc", "abd"};
    ViewContent vc = new ViewContent();

    public static void Main()
    {
        vc.InitView(content);
    }
}

public class ViewContent{
     string[] contentToView;

     public void InitView(ref string[] contentToShow)
     {
         contentToView = contentToShow;
         View();
     }

     public void View()
     {
         //Do whatever with contentToView
         //Example
         Array.Resize<string> (ref contentToView, someInt);
     }
}

如果我用

调整数组大小
Array.Resize()

引用中断以及对已调整大小的数组的任何进一步编辑都不会反映在test类的主数组上。

我的问题是:
当需要调整大小时,如何防止对主阵列的引用中断?
改写
如何在contentToView课程中调整content的大小时调整test的大小?

是的,我知道使用列表会更简单,但我正在尝试使用数组。

是的,我知道如果我传入test对象而不仅仅是一个数组,我的问题就会解决。我正在避免使用此方法,因为我还有其他具有字符串数组的对象。您可能会问,如果我有其他对象,它们提供类似的功能,我可以使用继承并接受基类以确保可以显示所有内容。这是我想避免的。

2 个答案:

答案 0 :(得分:2)

  

当需要调整大小时,如何防止对主阵列的引用中断?

你没有。你只是不使用数组。数组对象不可调整大小,并且在将contentToShow的值复制到contentToView后,对contentToShow变量的任何进一步更改都将被忽略,同样也会相反。

您要求contentToView每次content班级test更改时,Wrapper<T>更改其值(此为参考),反之亦然。没有办法实现这一目标。您可以使用您编写的public class Wrapper<T> { public T Value { get; set; } } 类引入另一级别的间接,基本上如下所示:

test.content

如果您随后ViewContent.contentToViewWrapper<string[]>两个test.content.Value字段,那么如果您更改ViewContent.contentToView.Value,则会在(function(){ var foo = { name: 'bob' }; console.log(foo.name); // bob })(); console.log(foo.name); // Reference error 中看到更改。但我会反对它。

答案 1 :(得分:2)

无法调整数组本身的大小。 Array.Resize方法创建新数组。所以无论如何你的旧参考都行不通。在代码中使用ref关键字也没有任何意义。仅当您在contentToShow方法内重新分配InitView时,它才有用。你必须使用一些类(List或你自己的类),如果你想&#34;调整大小&#34;你的数组(将它重新分配给新数组)。