代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

语言理论问题

c#
  •  1
  • JL. Hans Passant  · 技术社区  · 15 年前

    在下面的方法中,我传递配置byref,然后使用一个名为foreach的集合对其进行循环。在下面的代码示例中,我在循环中更改的值是否会在我通过ref传递的主对象中更新,我的意思是没有浅副本?或者你能发现我犯的任何错误吗?

    更具体地说,我调用config.value=配置对象有一组配置,那么在调用这个函数之后,这些配置会在主对象(配置)中更新吗?

    事先谢谢。

    public static void DecryptProviderValues(ref MyConfiguration configuration)
        {
            foreach (var provider in configuration.Providers)
            {
                var configItems = provider.Configurations;
                foreach (Configuration config in configItems)
                {
                    if(EncryptionManager.IsEncrypted(config.value))
                    {
                        config.Value = EncryptionManager.Decrypt(config.Value);
    
                    }
                }
            }
        }
    
    2 回复  |  直到 15 年前
        1
  •  6
  •   Marc Gravell    15 年前

    假设这里的所有项目 (不是结构),那么是的,但实际上 不需要 对于 configuration 将作为 ref ;你是 已经 传递引用(按值),而不是 重新分配 参考,所以不需要 裁判 在这里 完全 .您的更改将被保留并可供调用方使用。

    原因与此完全相同:

    Configuration x = new Configuration();
    Configuration y = x;
    x.Value = "abc";
    Console.WriteLine(y.Value); // writes "abc"
    

    这里,因为 Configuration 大概是 class 只有 一个对象和两个变量 参考 到同一对象(在简化级别上,它们是指向同一对象的美化指针)。

        2
  •  2
  •   Gregory Pakosz    15 年前

    不需要通过 configuration 通过 ref 在您的情况下,因为在C中,您已经在操纵对类实例的引用。

    你会使用 裁判 传递值类型,如 int struct 参考文献。