c#按值传递参数

时间:2015-01-29 14:53:27

标签: c#

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

        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();
    }

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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"在这种情况下,关键字(通过引用传递)是因为我们未在Foo方法中创建AddNode的新实例。

答案 2 :(得分:0)

您可以克服使用对象。也许传递这个:

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";
   }
}

因为您传递并存储了引用类型,这将反映您的类和消费者中的更改。