当方法中的overriden不在其外部更改时,数组参数

时间:2017-03-16 18:18:10

标签: c# .net

我有一个带字符串数组参数的方法。当在函数中我用另一个数组覆盖它时它不会在它之外改变(如果我理解正确的数组是通过引用传递的)。

我有一个看起来像这样的方法:

    static void Method(string word, string[] tab)
    {
        string [] tab1;
        [..] 

        tab = tab1; // tab changes to tab1
    }

     static void Main(string[] args)
    {
         string[]  tab = { "", "", "", "", "", "", "", "", "", "" };
         Method("443", tab);
         //and here tab does not change like I though it would.
     }

2 个答案:

答案 0 :(得分:2)

更好的设计是:

static string[] Method(string word, string[] tab)
{
    string [] tab1;
    [..] 

    return tab1;
}

static void Main(string[] args)
{
     string[] tab = { "", "", "", "", "", "", "", "", "", "" };
     tab = Method("443", tab);
}

答案 1 :(得分:1)

您需要通过引用传递它:

static void Method(string word, ref string[] tab)
{
    string [] tab1;
    [..] 

    tab = tab1; // tab changes to tab1
}

static void Main(string[] args)
{
     string[]  tab = { "", "", "", "", "", "", "", "", "", "" };
     Method("443", ref tab);
     //and here tab does not change like I though it would.
 }

说明:是数组是引用对象,但是默认值传递了此引用,因此您可以将其内容更改为更高范围。但参数(tab)仅保存此引用的副本,因为此引用按值传递。如果您想直接修改传递的参数引用以引用其他对象,则需要使用ref关键字。

如果您想避免使用ref关键字,则需要返回新数组,并在Main方法中使用它。

static string[] Method(string word, string[] tab)
{
    string [] tab1;
    [..] 

    return tab1;
}

static void Main(string[] args)
{
     string[]  tab = { "", "", "", "", "", "", "", "", "", "" };
     tab = Method("443", 
}