1

プロパティで i++ タイプの操作を取得した場合に追加できる特別なメソッドはありますか?

これが私がやろうとしていることの例です。これが機能しないことはわかっていますが、これにより、私が話していることのアイデアが得られます。実際、私は 2 つの内部で作業しており、1 つを + で、もう 1 つを - で増やしたいと考えています。

int mynum;
int yournum 
{
    get{ return mynum; }
    set{ mynum = value; }
    set++{ mynum = mynum + 5; return mynum; } //this is what I want to do
}
// elsewhere in the program
yournum++; //increases by 5
4

7 に答える 7

5

++プロパティで が呼び出されたときに発生する動作をオーバーライドしたいようですyournum。もしそうなら、サンプルで概説したコードを正確にC#で使用することはできません。++演算子はインクリメントする必要があり1、すべてのユーザー呼び出しyournum++はその動作を予期します。サイレントに変更すると、5確かにユーザーの混乱につながります

の代わりに変換を行うカスタム++演算子を使用して型を定義することで、同様の動作を得ることができます。例えば+ 5+1

public struct StrangeInt
{
    int m_value;

    public StrangeInt(int value)
    {
        m_value = value;
    }

    public static implicit operator StrangeInt(int i)
    {
        return new StrangeInt(i);
    }

    public static implicit operator int(StrangeInt si)
    {
        return si.m_value;
    }

    public static StrangeInt operator++(StrangeInt si)
    {
        return si.m_value + 5;
    }
}

と定義yournameした場合StrangeInt、探していた動作が得られます

于 2012-07-06T17:06:13.750 に答える
1

独自の構造体を作成し、演算子をオーバーロードします。

    public static YourType operator++(YourType t)
    {
            // increment some properties of t here
            return t;
    }
于 2012-07-06T17:11:54.177 に答える
1

JaredParの優れた回答に感謝します。誰かが興味を持っている場合、これが最終結果です。2 つの数値に基づいてパーセンテージを計算し、数値が増えるにつれて重み (名前の由来) を追加します。

public struct Weight
{
    int posWeight;
    int negWeight;
    int Weight
    {
        get
        {
            if (posWeight + negWeight == 0) //prevent div by 0
                return 0;
            else return posWeight / (posWeight + negWeight);
        }
    }
    public static Weight operator ++(Weight num)
    {
        num.posWeight++;
        if (num.posWeight > 2000000) //prevent integer overflow
        {
            num.posWeight = num.posWeight / 2;
            num.negWeight = num.negWeight / 2;
        }
        return num;
    }
    public static Weight operator --(Weight num)
    {
        num.negWeight++;
        if (num.negWeight > 2000000) //prevent integer overflow
        {
            num.posWeight = num.posWeight / 2;
            num.negWeight = num.negWeight / 2;
        }
        return num;
    }
    public static explicit operator int(Weight num) 
    { // I'll make this explicit to prevent any problems.
        return num.Weight;
    }
}
于 2012-07-06T18:27:49.947 に答える
1

はい、ただし (常に a but)... プロパティの型を にすることはできませんint。暗黙的に int に変換されますが、演算子をオーバーライドするカスタム プロキシ型を返す必要があります。

于 2012-07-06T17:07:25.847 に答える
1

これを直接行う方法はありません。これを提供する 1 つの方法 (本当に必要な場合) は、代わりに独自の型を提供し、必要な機能を実装するために演算子のオーバーロードintを使用することです。

于 2012-07-06T17:07:34.277 に答える
1

整数の演算子をオーバーライドしたい場合、++残念ながらそれは不可能です。

于 2012-07-06T17:07:53.943 に答える
0

プリミティブ型を使用することはできません。代わりに、次のような拡張メソッドを int に追加します。

public static int plusFive(this int myInt)
{
    return myInt + 5;
}

次に、それを使用するには、次のようにするだけです。

int a,b;
a = 5;
b = a.plusFive();
于 2012-07-06T18:14:14.587 に答える