如何在C#中将“路径”传递给对象成员?

时间:2010-09-13 17:44:18

标签: c# pointers

说我有

public class family
{
   public person father;
   public person mother;
   public person[] child;
}

public class person
{
   public string name;
   public int age;
}

我想要做的是向家庭添加一个功能,允许我指定我想要保存新人的位置。

如果有C,我会传入一个指向人的指针,所以我可以指向一个新人,但我对C#有些新意,不知道该怎么做。所以我希望它看起来像这样:

public void SavePerson(int newAge, string newName, ??? location)
{
   person addMe = new person();
   addMe.age = newAge;
   addMe.name = newName;
   location = addMe;
}

我不想更改以前的位置内容。如果它曾经指向弗兰克,我想让弗兰克保持原样,我只想让它现在指向约翰(因为其他事情可能仍然指向弗兰克)

我需要这个的原因是因为我有一个接口和类比这复杂得多。但是我需要创建一个类并保存很多(并且它出现在一个大型NHibernate创建的对象中)并且为了简单起见我想将它转换成一个函数。

1 个答案:

答案 0 :(得分:4)

惯用的C#做事方式是简单地返回新对象:

public Person CreatePerson(int age, string name)
{
    Person person = new Person();
    person.Age = age;
    person.Name = name;
    return person;
}

用法:

family.Children[0] = CreatePerson(11, "Frank");
family.Children[1] = CreatePerson(15, "John");

或者,您可以将Person[]和索引传递给方法:

public void SavePerson(int age, string name, Person[] persons, int index)
{
    persons[index] = new Person();
    persons[index].Age = age;
    persons[index].Name = name;
}

用法:

SavePerson(11, "Frank", family.Children, 0);
SavePerson(15, "John",  family.Children, 1);

但我不确定你为什么要把这个责任委托给你的工厂方法。


如果您真的想通过引用操作变量内容,可以使用refout关键字来执行此操作:

public void SavePerson(int age, string name, out Person person)
{
    person = new Person();
    person.Age = age;
    person.Name = name;
}

用法:

SavePerson(11, "Frank", out family.Children[0]);
SavePerson(15, "John",  out family.Children[1]);

请参阅:Parameter passing in C#

请参阅:When is using the C# ref keyword ever a good idea?


但为什么不简单地使用对象和集合初始化器?

Person mom = new Person { Age = 41, Name = "Martha" };
Person dad = new Person { Age = 43, Name = "Dan"    };

Family family = new Family(mom, dad)
{
    new Person { Age = 11, Name = "Frank" },
    new Person { Age = 15, Name = "John"  },
};

请参阅:Object and Collection Initializers