0

好的,所以这可能是一个奇怪的问题,但这里有。以下代码是非常通用的伪代码,但这将在 C# 中完成。

假设你有一个类如下:

public class Animal()
{
various methods and members here...

public Animals getSpecificAnimal(ref animalList,animalType, ref int whichAnimal)
{
//The logic in here will find your specifi animal, as well as the index of it in the list 

return Animal;
}

public void replaceSpecifiAnimal(ref animalList,Animal newAnimal, int whichAnimal)
{
//The assumption here is that you know the index of the specific animal you
//want to replace in the list.

animalList.RemoveAt(whichAnimal);
animalList.Add(newAnimal);

 }
}

public class Cat:Animal
{
}

public class Dog:Animal
{
}

public class Fish:Animal
{
}

现在,您已在这些动物列表中创建如下,并在某个类中使用它:

var animalList = new List<Animal>();

然后你添加了一些动物,比如狗、猫和鱼。但是,现在您想用不同的鱼替换 Fish,所以您可以这样做:

animalList[0].getSpecificAnimal(ref animalList, Fish,ref whichAnimal);

animalList[0].replaceSpecifiAnimal(ref animalList,newFish,whichAnimal);

这将用新鱼代替你的旧鱼。

所以现在问题是:使用列表中的某些内容来修改列表有什么危险?

这段代码,嗯......它的真实版本,有效。它编译并运行得很好。但我不禁觉得我在寻求一种危险,而不仅仅是一点点混淆。应该注意的是,即使(在这种情况下)Fish 的索引为零,该代码也可以工作。

我以这种方式编码是有原因的。我可以将作用于animalList 的方法放在不同的类中,但不这样做的好处是我可以传递animalList(一旦它被填充),而且它都是自包含的。

想法?

4

2 回答 2

0

你能给我们一些关于什么代码使用它的上下文吗?在我看来,您只需要找到给定类型的第一只动物。由于您使用的是 C# 4.0,因此您可以轻松地使用 LINQ。

List<Animal> animals = new List<Animal>{new Cat(), new Dog(), new Fish()};
Animal fish = animals.First(a => a is Fish);
animals.Remove(animals.First(a => a is Cat));
animals.Add(new Cat());

此外,绝对摆脱 ref 参数。在 C# 的大多数情况下,您不需要它们,在这种情况下很明显您不熟悉它们的正确用法。

于 2013-09-24T18:53:57.213 回答
0

这是我的想法。


声明getSpecificAnimalreplaceSpecifiAnimal作为静态方法。

public static void replaceSpecifiAnimal(...)

这样你就可以在没有这样的实例的情况下调用它们

Animal.replaceSpecifiAnimal(...);

摆脱所有的ref关键字。在您的示例中,他们绝对没有为您做任何事情。

于 2013-09-24T18:48:36.573 回答