2013-09-24 51 views
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); 

這將用新的取代舊的魚。

所以現在回答這個問題:在列表中使用某些東西來修改列表有什麼危險?

此代碼,以及它的真實版本,工作。它編譯和運行得很好。但我只是 不禁感覺,如果我正在追求一個危險,而不僅僅是一點混淆。應該注意到 即使(在這種情況下)魚在索引零中,代碼也能工作。

我按照自己的方式對此進行了編碼。我可以把對animalList的方法作爲一個不同的類,但是不這樣做的好處是我可以傳遞animalList(一旦它被填充),並且它是全部自包含的。

想法?

+7

爲什麼你使用'ref'? –

+0

首先你爲什麼要用'ref'? –

+1

你確定你明白'ref'的用途嗎? – Arran

回答

0

這是我的想法。


聲明getSpecificAnimalreplaceSpecifiAnimal爲靜態方法。

public static void replaceSpecifiAnimal(...) 

這樣,你可以給他們打電話沒有一個實例像這樣

Animal.replaceSpecifiAnimal(...); 

破除一切ref關鍵字。在你的例子中,他們對你毫無幫助。

+0

和是的,我知道關於擴展方法,但OP必須瞭解如何靜態方法首先在去那裏工作 –

+0

ref int是必需的,因爲我正在修改變量在其他地方使用,但是,對象的參考不是。 – Cynon

+0

哦,和(頭桌)我應該想到使用靜態方法!感謝那。 – Cynon

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#中,你並不需要它們,在這種情況下很明顯你不熟悉它們的正確用法。