2

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

次に、そのボーナスを認識して計算に追加するスキルという別のオブジェクトを用意します。Skill のコンストラクターに参照によって Ability を渡し、その参照を格納して、Ability が変更された場合に計算も同様に行われるようにしたいと考えました。これに関する明らかな問題は、明らかに参照を格納することが C# ではタブーであることです。

これを行うための回避策、またはこの問題に対処するための別の方法がありますか? Skill を評価する関数に毎回アビリティを渡す必要はありません。参照される関数は構築後に変更されることはないためです。

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

具体的な例を示すのに十分なコードを見ていませんが、これを行う方法は() => object.property、 this: の代わりに次のようなラムダデリゲートを渡すことですobject.property

于 2013-03-22T22:46:00.567 に答える
-1

C# には、参照型と値型があります。すべての非値型オブジェクトは参照によって渡されるため、参照に問題はありません。渡すだけで、参照によって渡されます。

于 2013-03-22T22:45:11.240 に答える