2

我正在为 C# 中的游戏构建内部逻辑,并且来自 C++,这对我来说可能会在翻译中丢失。

我有一个对象,Ability,它计算它提供的奖金并将其作为整数值返回。计算是动态的,可以根据各种变量而改变。

    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;
        }

然后我有另一个对象,技能,它应该知道该奖金并将其添加到它的计算中。我想通过引用将能力传递给技能的构造函数,然后存储该引用,以便如果能力改变了计算也可以。明显的问题是显然存储引用是 C# 中的禁忌。

是否有一种解决方法可以解决这个问题,或者有另一种方法来解决我的指针感染的大脑没有考虑的这个问题?我非常希望不必每次都将能力传递给评估技能的函数,因为引用的函数在构造后永远不会改变。

4

3 回答 3

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

有关更多详细信息,请参阅我关于引用和值以及C# 中的参数传递的文章。

于 2013-03-22T22:45:37.707 回答
0

我没有看到足够多的代码来给出一个具体的例子,但是这样做的方法是传入一个 lambda 委托,例如() => object.property而不是 this: object.property

于 2013-03-22T22:46:00.567 回答
-1

在 C# 中,有引用类型和值类型。所有非值类型的对象都是通过引用传递的,所以引用应该没有问题。只需传递它,它将通过引用传递。

于 2013-03-22T22:45:11.240 回答