在C#中使用多个强制转换和明显模式缩短代码的正确方法

时间:2014-07-19 13:12:38

标签: c# .net

所以,我有一个应用程序在屏幕上做一些绘画。我正在使用双打,但要画画,我必须使用浮子或整体。所以,像这样的事情经常发生:

g.DrawEllipse(monsterPen, new Rectangle(
  (int)Math.Round(x - (double)sizeVessel * 9.0 / 20.0), 
  (int)Math.Round(y - (double)sizeVessel * 9.0 / 20.0), 
  (int)Math.Round(sizeVessel * 18.0 / 20.0),
  (int)Math.Round(sizeVessel * 18.0 / 20.0)));

虽然看起来像这样

g.DrawEllipse(monsterPen, NewRectangleFromD(
  x - (double)sizeVessel * 9.0 / 20.0),
  y - (double)sizeVessel * 9.0 / 20.0),
  sizeVessel * 18.0 / 20.0,
  sizeVessel * 18.0 / 20.0)));

或者甚至喜欢这个

DrawCircle(g, monsterPen, x, y, sizeVessel * 9.0 / 20.0)

但是,我不确定如何做得更好。

在C / C ++中,如果我的记忆很好,你可以创建一个别名,例如这段代码:

DrawCircle(g, p, x, y, r) 

应该用于所有目的,视为:

g.DrawEllipse(p, new Rectangle(
  (int)Math.Round(x - r / 2.0), 
  (int)Math.Round(y - r / 2.0), 
  (int)Math.Round(r), 
  (int)Math.Round(r))

但我在C#中找不到这样的选项。由于无法强制内联(我在.Net 4.0中工作),我很害怕如果我只是声明一个DrawCircle方法,那么我将减慢我的应用程序(这些绘制调用经常进行)。

那么,采取什么方法是正确的?

2 个答案:

答案 0 :(得分:4)

一种选择是使用extention methods

public static class GraphicsExtentions
{
    public static void DrawEllipse(this Graphics g, Pen pen, double x, double y, double width, double height)
    {
        g.DrawEllipse(pen, (int)x, (int)y, (int)width, (int)height);
    }
}

您可以这样称呼:

double x, y, w, h;
...
g.DrawEllipse(pen, x, y, w, h);

如果你希望它超级快,你可以看看激进的inlining attribute

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void DrawEllipse(this Graphics g, Pen pen, double x, double y, double width, double height)
{
    g.DrawEllipse(pen, (int)x, (int)y, (int)width, (int)height);
}

答案 1 :(得分:1)

我会在这里回答,指出为什么你不应该为此烦恼。

您正在使用GDI +,它是一个软件渲染器。无论如何,使用此库进行密集图形非常慢

调用函数需要多少个CPU周期?实际在软件中绘制椭圆需要多少?我没有这些数字,但我确信有一件事:它们会相差几个数量级。

结论:你正试图在这里优化错误的东西。如果要显示 fast 图形,请使用硬件加速解决方案。