什么类型传递到功能

时间:2015-12-03 10:25:32

标签: c#

我有一个简单的应用程序,它有一个抽象类BaseType,以及两个派生类FirstDerived : BaseTypeSecondDerived : BaseType。在派生类中,我调用函数base.MakeChange(Item.ID);来更改嵌入属性Item的实例值。它没有改变。正如我所解释的那样因为base.MakeChange(Item.ID);不改变FirstDerived的实例,所以在函数中它会创建另一个实例。但我认为函数MakeChange应该引用Item,因为它是引用类型。似乎MakeChange获取类型值。为什么?我哪里错了?

namespace ConsoleApplication7
{
class Program
{
    static void Main(string[] args)
    {
        Data d = new Data();
        Console.WriteLine(((FirstDerived)d.Items[0]).Item.ID);
        Console.ReadKey();
    }
}

public class Item
{
    public string ID { get; set; }
}

public abstract class BaseType
{
    public void MakeChange(string id)
    {
        id = "5";
    }
}

public class FirstDerived : BaseType
{
    public FirstDerived()
    {
        Item = new Item();
        Item.ID = "4";
        base.MakeChange(Item.ID);
    }
    public Item Item { get; set; }
}

public class SecondDerived : BaseType
{

    public SecondDerived()
    {
        Item = new Item();
        base.MakeChange(Item.ID);
    }
    public Item Item { get; set; }
}
public class Data
{
    public ObservableCollection <BaseType> Items { get; set; }

    public Data()
    {
        Items = new ObservableCollection<BaseType>();
        Items.Add(new FirstDerived());
    }
}
}

2 个答案:

答案 0 :(得分:1)

您正在重置方法中本地作用域id的值,而不是传入方法的属性。

如果你想这样做,你必须让id传递引用或者只返回新值:

public string MakeChange(string id)
{
    return "5";
}

public void MakeChangeAsRef(ref string id)
{
    id = "5";
}

然后这样称呼:

Item.ID = this.MakeChange(Item.ID);

ref

string id = Item.ID;
this.MakeChangeAsRef(ref id);
Item.ID = id;

另一种选择是传递Item

(不要打电话给base.,因为它可能会在某一天打破覆盖该方法。this现在将做同样的工作)

答案 1 :(得分:1)

  1. public void MakeChange(Item item) 将项目参数作为对象

  2. base.MakeChange(项目);

  3. 在您的FirstDerived和SecondDerived中