我正在为C#中的游戏构建内部逻辑,并且来自C ++这对我来说可能会在翻译中丢失。
我有一个对象,能够计算它提供的奖励并将其作为整数值返回。计算是动态的,可以根据各种变量而变化。
public class Ability: Buffable
{
public string abbr { get; private set; }
public Ability(string name, string abbr, uint score) : base(name, score)
{
this.abbr = abbr;
}
// Ability Modifier
// returns the ability modifier for the class.
public int Ability_modifier()
{
const double ARBITARY_MINUS_TEN = -10;
const double HALVE = 2;
double value = (double)this.Evaluate();
double result = (value + ARBITARY_MINUS_TEN) / HALVE;
// Round down in case of odd negative modifier
if (result < 0 && ((value % 2) != 0))
{
result--;
}
return (int)result;
}
然后我有另一个对象,技能应该知道该奖金并将其添加到它的计算中。我想通过引用将一个Ability传递给Skill的构造函数,然后存储该引用,这样如果Ability更改了计算也是如此。显而易见的存储引用的明显问题是C#中的禁忌。
是否有一种方法可以做到这一点,或者是另一种方法来解决我的指针感染心灵没有考虑的问题?我非常希望不必每次都将功能传递给评估技能的函数,因为引用的函数在构造后永远不会改变。
答案 0 :(得分:3)
明显的问题是显然存储引用是C#中的禁忌。
绝对不是。参考文献存储在整个地方。你在这里做,例如:
this.abbr = abbr;
System.String
是一个类,因此是一个引用类型。因此abbr
的值是参考。
我强烈怀疑你误解了引用类型在C#中是如何工作的。如果您还记得对象的引用,则可以通过引用看到对象的更改。但是,对您复制的原始表达式的更改将不会。
例如,使用StringBuilder
作为方便的可变引用类型:
StringBuilder x = new StringBuilder("abc");
// Copy the reference...
StringBuilder y = x;
// This changes data within the object that x's value refers to
x.Append("def");
// This changes the value of x to refer to a different StringBuilder
x = new StringBuilder("ghi");
Console.WriteLine(y); // abcdef
有关详细信息,请参阅references and values上的文章和parameter passing in C#。
答案 1 :(得分:0)
我没有足够的代码来提供一个具体的例子,但是这样做的方法是传入一个lambda委托,例如() => object.property
而不是:object.property
。
答案 2 :(得分:-1)
在C#中,有引用类型和值类型。所有非值类型对象都通过引用传递,因此引用应该没有问题。只需传递它,它将通过引用传递。