2

通过“直接”,我的意思是 Size*2 (不起作用),而不是:

size1 = new Size(size1.Width * 2, size1.Height * 2);
4

4 回答 4

5

您可以在技术上编写扩展方法:

public static class Extensions {
    public static Size Multiply(this Size size, double factor) {
        return new Size((int)(size.Width * factor), (int)(size.Height * factor));
    }
}

但几乎没有人会正确使用它。他们会写

this.Size.Multiply(1.2);

而不是必需的

this.Size = this.Size.Multiply(1.2);

一个几乎不可避免的错误,因为它看起来像一个实例方法。所以不要这样做,只写一个静态辅助方法。

于 2012-04-22T16:39:05.290 回答
4

您可以重载 * 运算符:

class Size 
{
    public int Width { get; set; }
    public int Height { get; set; }

    public Size(int w, int h)
    {
        this.Width = w;
        this.Height = h;
    }

    public static Size operator *(Size s, int n)
    {
        return new Size(s.Width * n, s.Height * n);
    }
}

现在你可以这样做:

Size s1 = new Size(1, 2);
Size s = s1 * 2; // s.Height = 2, s.Width = 4
于 2012-04-22T15:59:35.763 回答
2

由于没有为Size 结构实现 * 运算符,因此您必须创建一个。但是使用扩展方法是不可能创建新的操作符的。相反,您可以创建一个名为 multiply 的扩展方法。

于 2012-04-22T16:01:43.300 回答
0

不是没有工作,但很容易使运算符重载

请参阅codeproject 上的运算符重载演示

见右下角:

public static MySize operator +(MySize mySize, Int32 value)
{
    return new MySize(
        mySize.m_Width + value,
        mySize.m_Height + value);
}

计算出 * 运算符重载应该不会花很长时间

于 2012-04-22T15:57:29.387 回答