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

C# 使用C语言中的许多强制转换和明显模式缩短代码的正确方法#,c#,.net,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 /

所以,我有一个在屏幕上画画的应用程序。我用双精度运算,但要画画,我必须使用浮点或整数。所以,像这样的事情经常发生:

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)
甚至像这样

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#中找不到这样的选项。由于没有强制内联的能力(我在.NET4.0中工作),如果我仅仅声明一个DrawCircle方法来实现这一点,我会减慢我的应用程序的速度(这些draw调用非常频繁)

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

一个选项是使用:

你这样称呼它:

double x, y, w, h;
...
g.DrawEllipse(pen, x, y, w, h);
如果你想让它超快,你可以看看它的侵略性:

一种选择是使用:

你这样称呼它:

double x, y, w, h;
...
g.DrawEllipse(pen, x, y, w, h);
如果你想让它超快,你可以看看它的侵略性:


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

您正在使用GDI+,它是一种软件渲染器。无论如何,使用此库进行密集图形处理的速度都会非常缓慢

调用一个函数需要多少CPU周期?在软件中真正画一个ellpise需要多少人?我没有这些数字,但我确信有一件事:它们将相隔几个数量级


结论:您试图优化的东西是错误的。如果您想快速显示图形,请使用硬件加速解决方案。

我将在这里回答您的问题,指出您不必为此烦恼的原因

您正在使用GDI+,它是一种软件渲染器。无论如何,使用此库进行密集图形处理的速度都会非常缓慢

调用一个函数需要多少CPU周期?在软件中真正画一个ellpise需要多少人?我没有这些数字,但我确信有一件事:它们将相隔几个数量级


结论:您试图优化的东西是错误的。如果您想快速显示图形,请使用硬件加速解决方案。

使用扩展方法?@DavidG但它没有额外成本吗?如果我使用扩展方法,调用堆栈是这样的:(main->call DrawCircle->call drawerlipse)还是这样的(main->call drawerlipse)?每件事都会有代价,但我怀疑这会引起任何明显的后果。好吧,对于别名或内联,没有代价-短符号等同于长符号(唯一的成本是编译代码所需的时间)。因此,我需要一个无成本(在运行时)解决方案,因为显然可以achieve@KeithPayne不正确。C#是一种JITted语言,但GC可能确实是一个问题。创建一个扩展方法?@DavidG但它没有额外的成本吗?如果我使用扩展方法,调用堆栈会是这样的:(main->call DrawCircle->call drawerlipse)还是这样(main->call drawerlipse)?每件事都有代价,但我怀疑这会引起任何明显的后果。好吧,对于alias或inline,没有代价-短符号相当于长符号(只有编译代码所需的时间才有代价)。因此,我需要一个无代价(在运行时)解决方案,因为显然可以achieve@KeithPayne不正确。C#是一种JITted语言,但GC可能确实是一个问题。谢谢你。正如我上面回答的,我正在寻找一种无成本的解决方案,因为在这种情况下,它显然是可以实现的……为什么你认为它“显然是可以实现的”考虑一下这个问题:我制作了一个定制的文本编辑器,它编辑了.c++文件。这个编辑器将新的语法引入到C++中的别名中,它有一个“导出”选项。cs++文件到cs文件,在这个过程中,别名被替换为它们的别名。没有实现任何成本解决方案。当然,这将是笨拙的,因为我必须编辑我的cs文件超过Visual Studio,显然我不会这么做,但这证明了这是可能的。现在的问题是,这是否已经在C中实现了#或者没有……对不起,但这对我来说没有什么意义。也许我解释得不好。我想说的是,你可以创建一个脚本(算法?程序?),它将引入一种方法,通过用C代码替换文件中的模式来做我想做的事情(比如,如上所述,将所有的“DrawCircle”更改为“DrawEllipse”)。这意味着您必须在另一个应用程序中编辑代码,然后在编译之前应用脚本生成一个c代码文件。因此,当我编辑代码时,我看到“DrawCircle”和压缩代码,但在c文件中,“DrawEllipse”和扩展代码存在(并发送给编译器)谢谢。我在上面回答的时候,我在寻找一个无成本的解决方案,因为在这种情况下它是显然可行的…为什么你认为它是“明显的可实现的”?考虑一下:我制作了一个定制的文本编辑器,它编辑了C+++文件。这个编辑器将C++中的新语法引入到C++中的别名中。cs++文件到cs文件,在这个过程中,别名被替换为它们的别名。没有实现任何成本解决方案。当然,这将是笨拙的,因为我必须编辑我的cs文件超过Visual Studio,显然我不会这么做,但这证明了这是可能的。现在的问题是,这是否已经在C中实现了#或者没有……对不起,但这对我来说没有什么意义。也许我解释得不好。我想说的是,你可以创建一个脚本(算法?程序?),它将引入一种方法,通过用C代码替换文件中的模式来做我想做的事情(比如,如上所述,将所有的“DrawCircle”更改为“DrawEllipse”)。这意味着您必须在另一个应用程序中编辑代码,然后在编译之前应用脚本生成一个c#代码文件。因此,当我编辑代码时,我会看到“DrawCircle”和compact