20

これは機能します:

using System;
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>;

namespace ConsoleApplication2
{
    class test
    {
        public ConstraintSet a { get; set; }
        public test()
        {
            a = new ConstraintSet();
        }
        static void Main(string[] args)
        {
            test abc = new test();
            Console.WriteLine("done");
        }
    }
}

これはしません:

using System;
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>;

namespace ConsoleApplication2
{
    class test
    {
        public ConstraintSet a { get { return a; } set { a = value; } }
        public test()
        {
            a = new ConstraintSet();
        }
        static void Main(string[] args)
        {
            test abc = new test();
            Console.WriteLine("done");
        }
    }
}

2番目のクラスのセッターでスタックオーバーフロー例外が発生しましたが、その理由がわかりません。Unityゲームエンジンでサポートされていないため、最初のフォームを使用できません。

4

4 に答える 4

47

を書くa = valueと、プロパティセッターを再度呼び出します。

非自動プロパティを使用するには、次のように、個別のプライベートバッキングフィールドを作成する必要があります。

ConstraintSet a;
public ConstraintSet A { get { return a; } set { a = value; } }
于 2010-07-18T15:42:56.823 に答える
20

バッキング変数を宣言していません。ゲッターとセッターが自分自身を呼び出すプロパティがあります。最初のフォームがUnityでサポートされていない理由はわかりません。つまり、同等のフォームもサポートされない可能性がありますが、基本的には次のようになります。

private ConstraintSet aValue;
public ConstraintSet a { get { return aValue; } set { aValue = value; } }

もちろん、私は通常、より一般的な名前を持っています。つまり、「value」ビットがなくても逃げることができます。

private ConstraintSet constraints;
public ConstraintSet Constraints
{
    get { return constraints; } 
    set { constraints = value; }
}

現在の2番目のフォームがをスローしている理由についてもう少し詳しく説明するために、StackOverflowExceptionプロパティは基本的に偽装されたメソッドであることを常に覚えておく必要があります。壊れたコードは次のようになります。

public ConstraintSet get_a()
{
    return get_a();
}

public void set_a(ConstraintSet value)
{
    set_a(value);
}

うまくいけば、そのバージョンがスタックを吹き飛ばしている理由は明らかです。修正されたバージョンでは、プロパティを再度呼び出すのではなく、変数を設定するだけなので、展開すると次のようになります。

private ConstraintSet aValue;

public ConstraintSet get_a()
{
    return aValue;
}

public void set_a(ConstraintSet value)
{
    aValue = value;
}
于 2010-07-18T15:42:58.407 に答える
5

getterとsetter内で同じ変数名を使用することはできません。これにより、それ自体が呼び出され、最終的にスタックオーバーフローが発生します。再帰が多すぎます。

バッキング変数が必要です。

private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }
于 2010-07-18T15:44:31.193 に答える
3

パブリックプロパティにプライベートバッキング変数が必要です。

private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }
于 2010-07-18T15:43:20.510 に答える