使用对象列表

时间:2013-09-24 18:42:58

标签: c# c#-4.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>();

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

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

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

这将用新的鱼取代旧鱼。

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

这段代码,以及它的真实版本是有效的。它编译并运行得很好。但我只是 我不禁感到好像在追求一种不仅仅是一点混淆的危险。这应该 请注意,即使(在这种情况下)Fish在索引为零,代码也会起作用。

有理由我按照我的方式对此进行编码。我可以把动作的方法放在 一个不同的类,但不这样做的好处是我可以传递animalList(一旦它被填充),它都是自包含的。

思想?

2 个答案:

答案 0 :(得分:0)

这是我的想法。


getSpecificAnimalreplaceSpecifiAnimal声明为静态方法。

public static void replaceSpecifiAnimal(...)

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

Animal.replaceSpecifiAnimal(...);

删除所有ref个关键字。在你的例子中,它们对你毫无帮助。

答案 1 :(得分: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#的大多数情况下,你不需要它们,在这种情况下你很清楚你不熟悉它们的正确用法。