说我有
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创建的对象中)并且为了简单起见我想将它转换成一个函数。
答案 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);
但我不确定你为什么要把这个责任委托给你的工厂方法。
如果您真的想通过引用操作变量内容,可以使用ref
或out
关键字来执行此操作:
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]);
请参阅: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" },
};