C# 哪种代码更干净、更快或更优雅/更可取?是否已经有一个函数可以执行此操作?

C# 哪种代码更干净、更快或更优雅/更可取?是否已经有一个函数可以执行此操作?,c#,xna,C#,Xna,我写了这两个来修正矩形。例如,如果矩形具有以下属性: X:32,Y:32,宽度:-32,高度:-32 这将使矩形X:0,Y:0,宽度:32,高度:32 if (r.Width < 0) { r.X -= Math.Abs(r.Width); r.Width = Math.Abs(r.Width); } if (r.Height < 0) { r.Y -= Math.Abs(r.Height); r.Height = Math.Abs(r.Height)

我写了这两个来修正矩形。例如,如果矩形具有以下属性:

X:32,Y:32,宽度:-32,高度:-32

这将使矩形X:0,Y:0,宽度:32,高度:32

if (r.Width < 0)
{
    r.X -= Math.Abs(r.Width);
    r.Width = Math.Abs(r.Width);
}
if (r.Height < 0)
{
    r.Y -= Math.Abs(r.Height);
    r.Height = Math.Abs(r.Height);
}
他们俩都干得很好。我的问题是哪个?我觉得第一个可能更快,可读性更强,但第二个代码行更少。而且,我觉得这可能已经被发明出来了。在.NET或XNA框架中是否已有这样的方法

谢谢

编辑:有人发布了我非常喜欢的第二种方式的缩短版本,并将其合并到以下内容中:

r = new Rectangle(r.X + Math.Min(0, r.Width), r.Y + Math.Min(0, r.Height), Math.Abs(r.Width), Math.Abs(r.Height));

老实说,我更喜欢少线多线,我不认为这是太复杂。如果有什么我可以放置注释或将其封装到一个具有描述性名称的方法中。

如果您知道r.Width和r.Height都<0,为什么需要对它们进行Abs?去掉它,它会更快、更简单

if (r.Width < 0)
{
    r.X += r.Width;
    r.Width = -r.Width;
}
if (r.Height < 0)
{
    r.Y += r.Height;
    r.Height = -r.Height;
}
if(右宽度<0)
{
r、 X+=r.宽度;
r、 宽度=-r.宽度;
}
如果(r.高度<0)
{
r、 Y+=r.高度;
r、 高度=-r.高度;
}
我觉得你写的第二种方法很难看。你看不到它,就会立刻意识到它在做什么。记住吻

编辑:我知道您喜欢尽可能少的代码行,因此我重新设计了上述代码:

if (r.Width < 0) { r.X += r.Width; r.Width = -r.Width; } if (r.Height < 0) { r.Y += Height; r.Height = -r.Height; }
if(r.Width<0){r.X+=r.Width;r.Width=-r.Width;}if(r.Height<0){r.Y+=Height;r.Height=-r.Height;}
同样简单——而且都在一行代码中!这句话的字数甚至比你的选择还要少


行数通常不是一个很好的编程美衡量标准,但它当然是你的代码,所以你必须去做那些带给你最大乐趣的事情。

如果你知道r.宽度和r.高度都<0,为什么你需要在它们上面加上Abs?去掉它,它会更快、更简单

if (r.Width < 0)
{
    r.X += r.Width;
    r.Width = -r.Width;
}
if (r.Height < 0)
{
    r.Y += r.Height;
    r.Height = -r.Height;
}
if(右宽度<0)
{
r、 X+=r.宽度;
r、 宽度=-r.宽度;
}
如果(r.高度<0)
{
r、 Y+=r.高度;
r、 高度=-r.高度;
}
我觉得你写的第二种方法很难看。你看不到它,就会立刻意识到它在做什么。记住吻

编辑:我知道您喜欢尽可能少的代码行,因此我重新设计了上述代码:

if (r.Width < 0) { r.X += r.Width; r.Width = -r.Width; } if (r.Height < 0) { r.Y += Height; r.Height = -r.Height; }
if(r.Width<0){r.X+=r.Width;r.Width=-r.Width;}if(r.Height<0){r.Y+=Height;r.Height=-r.Height;}
同样简单——而且都在一行代码中!这句话的字数甚至比你的选择还要少


行数通常不是一个很好的编程美的衡量标准,但它当然是你的代码,所以你必须去做给你带来最大乐趣的事情。

第一个更具可读性,而且它也应该稍微快一点,因为如果没有什么事情做,它会做得更少

检查值是否为负值后,您知道它们为负值,因此不需要任何
Math.Abs

if (r.Width < 0) {
    r.Width = -r.Width;
    r.X -= r.Width;
}
if (r.Height < 0) {
    r.Height = -r.Height;
    r.Y -= r.Height;
}

第一种方法更具可读性,而且速度也应该稍快一些,因为如果没有什么事情可做,它会做得更少

检查值是否为负值后,您知道它们为负值,因此不需要任何
Math.Abs

if (r.Width < 0) {
    r.Width = -r.Width;
    r.X -= r.Width;
}
if (r.Height < 0) {
    r.Height = -r.Height;
    r.Y -= r.Height;
}

谢谢,我已经解决了这个问题:r=新矩形(r.X+Math.Min(0,r.Width),r.Y+Math.Min(0,r.Height),Math.Abs(r.Width),Math.Abs(r.Height));谢谢,我已经解决了这个问题:r=新矩形(r.X+Math.Min(0,r.Width),r.Y+Math.Min(0,r.Height),Math.Abs(r.Width),Math.Abs(r.Height));我在某种程度上同意你。是的,我认为上面的例子更清晰易读,但这是一个独立的项目,其他人永远不会看到。无论哪种方式,我都能理解代码,如果我把它放在一行中,我就不必看它或思考它。这有点像是将某些东西封装到类中。你把它弄得看不见了,然后可以忘掉它,去想其他的事情。当然,这种行为可以通过把上面的代码放在一个方法中,并给它一个描述性的名称来模仿,我也不一定反对。是的,再想想,我想我会把你的代码放在你文章的顶部,然后把它放在一个方法中。谢谢公平的说,我得到的动力是使代码尽可能短,但我反对这样做,因为其他人会看到我的代码(我也会把忘记代码在这方面如何工作的未来我算在内)。我在某种程度上同意你的看法。是的,我认为上面的例子更清晰易读,但这是一个独立的项目,其他人永远不会看到。无论哪种方式,我都能理解代码,如果我把它放在一行中,我就不必看它或思考它。这有点像是将某些东西封装到类中。你把它弄得看不见了,然后可以忘掉它,去想其他的事情。当然,这种行为可以通过把上面的代码放在一个方法中,并给它一个描述性的名称来模仿,我也不一定反对。是的,再想想,我想我会把你的代码放在你文章的顶部,然后把它放在一个方法中。谢谢公平的说,我得到的动力是使代码尽可能短,但我会像其他人看到我的代码一样反对(我也会把忘记代码在这方面如何工作的未来我算在内)。