【问题标题】:c# Passing parameter by valuec# 按值传递参数
【发布时间】:2015-01-29 14:53:27
【问题描述】:

我创建了一个在构造函数中传递字符串参数的类。我在构造函数中更改参数的值。当控件回到我原来的类时,值不会改变。我希望它会改变 - 请帮助

        string NewNodeName = "";
        AddNode NewNodeFrm = new AddNode( NewNodeName);

        NewNodeFrm.ShowDialog();
        if (NewNodeFrm.DialogResult.Equals(true))
        {
           MessageBox.Show(NewNodeName);
        }

在类中调用

public partial class AddNode : Window
{
    private string NodeName;

    public AddNode(ref string ANodeName)
    {
        NodeName = ANodeName;
        NodeName = "Fred";

        InitializeComponent();
    }

【问题讨论】:

  • DialogResult.Equals(true) - 这很奇怪,你从哪里学来的?
  • 当您使用ref 参数调用方法时,它应该会报错,除非您也使用ref 调用...?另外,您不要分配ANodeName。
  • 顺便说一句,拥有一个改变入站参数/变量的构造函数是非常不寻常的。构造函数应该构造/初始化一个新的对象实例,而不是改变其他对象!
  • 可能相关的old question of mine 与ints 提出了类似的问题。

标签: c#


【解决方案1】:

当您编写NodeName = "Fred"; 时,您正在更改NodeName 所指的内容。那是因为NodeName 本身不是ref string。

【讨论】:

    【解决方案2】:

    值得一提的是,字符串是一种不可变的引用类型,它的实现方式使其偶尔看起来是一种值类型。所以当你这样做时:

    NodeName = ANodeName;
    

    您正在创建副本,而不是参考。

    如果你做了这样的事情:

            Foo NewNodeName = new Foo();
            AddNode NewNodeFrm = new AddNode(ref NewNodeName);
            MessageBox.Show(NewNodeName.ToString());
    

    还有:

        public class Foo
        {
            private int _a = 0;
    
            public int BAR { get { return _a; } set { _a = value; } }
        }
    
        public class AddNode
        {
            private Foo NodeName;
    
            public AddNode(ref Foo ANodeName)
            {
                NodeName = ANodeName;
                NodeName.BAR = 30;
            }
        }
    

    这样就可以了,调用者可以看到更改,因为您在 AddNode 方法中处理同一个对象。事实上,在这种情况下,您不需要使用“ref”关键字(通过引用传递),因为我们没有在 AddNode 方法中创建 Foo 的新实例。

    【讨论】:

    • 字符串“表现得像值类型”这一事实根本不重要。如果您一直在处理 NodeName = ANodeName; NodeName = new object() 的对象,仍然不会影响 ANodeName。
    • 他期待 NewNodeName 从 AddNode 方法返回“Fred”。我让 OP 知道,当分配“NodeName = ANodeName;”时,由于新的字符串实例化,这不会发生。制作完成。
    • 我知道,但这与您正在使用的对象是引用类型还是值类型无关。
    • 啊,我现在和你在一起!;如果它是一个对象,同样的事情。好点子。我认为我的最后一句话可能是对正在发生的事情最准确的描述!
    • 字符串 not 像值类型一样被处理。它像引用类型一样被处理,因为它是一个引用,而不是一个值。它的任何行为都不像一个值而不是一个引用。它是immutable,而不是mutable,它与值/引用语义nothing。这个答案是 100% 错误的。
    【解决方案3】:

    你可以使用一个对象来克服。也许通过这个:

    Public class NodeName
    {
    
           public string Name{get;set;}
    
    }
    

    然后在你的构造函数中设置一个局部变量并更改名称

    public AddNode : Window
    {
        Private NodeNme name;
        Public  AddNode(NodeNme name)
       {
            this.name = name;
            this.name.Name = "Fred";
       }
    }
    

    因为你正在传递和存储一个 ref 类型,这将反映你的类和你的消费者的变化。

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2011-02-22
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多