我正在從Java轉移到C#,並且一直在編寫一些示例程序。現在我遇到了不同對象列表(IUnit),當我調用列表中的某個值來更改其值時,它會更改所有值。我已經添加了對List的引用 - 按照其他Stack溢出問題。參考不改變值的列表
所以,我有以下類
interface IUnit
{
int HealthPoints { set; get; }
String ArmyType { get; }
}
這是基類,我稱之爲創建軍團類型(海軍陸戰隊員/步兵)的列表。實現是一樣的,期望對類內的值進行更改。
public class Infantry : IUnit
{
private int health = 100;
protected String armyType = "Infantry";
public int HealthPoints
{
get
{
return health;
}
set
{
health = value;
}
}
public String ArmyType
{
get
{
return armyType;
}
}
然後我用下面的代碼
List<IUnit> army = new List<IUnit>();
Infantry infantry = new Infantry();
Marine marine = new Marine();
army.Add(Marine);
然後,我有一個方法,它只是帶走25從健康點初始化列表。
public void ShotRandomGuy(ref List<IUnit> army)
{
army[0].HealthPoints = army[0].HealthPoints - 25;
}
然後我按如下所示調用該方法。
battle.ShotRandomGuy(ref army);
但是,它需要從列表中的所有對象中取消25。我會如何阻止它呢?我已經添加了對列表的引用,所以我認爲它會將它從原始列表中刪除。我需要克隆列表嗎?這會起作用嗎?
還是更多的是設計問題?
謝謝!
寫一些東西來改變屬性的數值你在列表中多次添加了同樣的'marine'實例嗎? –
你誤解了'ref'開頭。你的'ShotRandomGuy'方法根本不需要使用'ref'。請參閱http://yoda.arachsys.com/csharp/parameters.html您還應該瞭解自動實施的屬性。 –
閱讀以下內容,它將有所幫助:http://stackoverflow.com/questions/5501374/basic-difference-between-value-types-and-reference-types –