【问题标题】:When assigning a static array to a non-static array in C#, is it done by reference or value?在 C# 中将静态数组分配给非静态数组时,是通过引用还是值来完成?
【发布时间】:2018-12-29 15:07:25
【问题描述】:

我的问题是关于 C# 语言行为的。我有一些代码,其中有一些具有不同值的静态数组和一个在不同时间设置为这些数组之一的非静态字段数组。我的假设是,如果调用下面的 UpdateArrayToUse,它会通过引用设置它,这意味着如果稍后再次调用 LoadArrays 并且磁盘值已更改,那么非静态字段 Options 将已经更改。但是,这不是我看到的行为。我很想知道是否有人对此有任何见解。

    private static string[] StaticArray1;
    private static string[] StaticArray2;

    public static void LoadArrays()
    {
        //Loads arrays from disk, can be changed elsewhere
        StaticArray1 = LoadArray1();
        StaticArray2 = LoadArray2(); 
    }

    public void UpdateArrayToUse(int i)
    {
        if(i == 1){
            Options = StaticArray1;
            return;
        }

        Options = StaticArray2;
    }

    public string[] Options;

【问题讨论】:

  • 代码中的三个数组都不是非静态的,尽管您的问题暗示应该有一个?
  • 该死的,是的,当我为这个问题近似真实代码时,这是一个错字。固定。

标签: c# reference static non-static


【解决方案1】:

LoadArray 中的代码不会更改任何数组。它分配方法返回的内容,显然是新方法,然后将它们分配给变量。因此,如果您在某处存储对先前数组的引用,它仍将保留其值。

如果数组已经创建并且您更改了其中的值,情况会有所不同。然后你期望看到的就会发生。

但我们并不确切知道这些加载方法中的代码是做什么的。它也可以使用没有再次分配的内部数组,在这种情况下,它又会有所不同。

【讨论】:

  • 这正是我正在寻找的答案,谢谢。 Options 只是存储对静态数组中曾经存在的内容的引用,而不是对该字段的引用。现在看起来很明显!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多