1

如果对属性进行 i++ 类型的操作,是否可以添加特殊方法?

这是我正在尝试做的一个例子。我知道这行不通,但这让您了解我在说什么。实际上,我正在使用两个内部组件,我想在 + 上增加一个,在 - 上增加另一个。

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

是但是(总是一个但是)...属性类型不能是int,您需要返回一个自定义代理类型,它隐式转换为 int 但覆盖运算符。

于 2012-07-06T17:07:25.847 回答
1

没有办法直接做到这一点。提供此功能的一种方法(如果您真的需要它)是提供您自己的类型,而不是int使用运算符重载来实现您需要的功能。

于 2012-07-06T17:07:34.277 回答
1

如果您想覆盖++整数运算符,那么不幸的是,这是不可能的。

于 2012-07-06T17:07:53.943 回答
1

创建自己的结构并重载运算符:

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

非常感谢 JaredPar的出色回答。如果有人感兴趣,这是最终结果。它是根据两个数字计算百分比,以便随着更多数字的出现而增加权重(因此得名)。

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 回答
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 回答