传递到函数中的类型

本文关键字:类型 函数 | 更新日期: 2023-09-27 18:25:25

我有一个简单的应用程序,它有一个抽象类BaseType,以及两个派生类FirstDerived : BaseTypeSecondDerived : BaseType。在派生类i中,调用函数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());
    }
}
}

传递到函数中的类型

您正在重置方法内部本地作用域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. public void MakeChange(项目项)将项目参数作为对象

  2. base.MakeChange(Item);

在您的第一个派生和第二个派生中