【发布时间】:2021-05-10 12:17:30
【问题描述】:
我正在与设计师合作开发一个应用程序,其中可以调整一些形状项目的大小。要仅在一种“ResizeThumb”类型中调整不同形状的大小,我有以下两个程序:
switch(Mode)
{
case Mode.CircleCenter:
if (item is Circle circle1)
{
// ...
}
break;
case Mode.CircleRadius:
if (item is Circle circle2)
{
// ...
}
break;
case Mode.RectTopLeft:
if (item is MyRect rect1)
{
// ...
}
break;
// many cases...
default: break;
}
或
if (item is Circle circle)
{
switch (Mode) // just 2 cases
{
case Mode.CircleCenter:
// ...
break;
case Mode.CircleRadius:
// ...
break;
default: break;
}
}
else if (item is MyRect rect)
{
switch (Mode)
{
case Mode.RectTopLeft:
// ...
break;
// 8 cases of every border and corner
default: break;
}
}
else if (item is MyEllipse ellipse)
{
switch (Mode) { /* 8 cases of every border and corner */ }
}
else if (item is Line ellipse)
{
switch (Mode) { /* 2 cases of every endpoint */ }
}
else
{
// No Code
}
当我有很多形状要调整大小时,哪个会更快更稳定?似乎第一个会更快,但我不确定。第二个会简单方便(不用rect1, rect2 , ... ,rect8)。我的应用中应该使用哪个?
【问题讨论】:
-
"应该在我的应用程序中使用哪个?" -- 首先,始终选择最清晰和最易于维护的。如果您出于性能原因需要对其进行更改,请使用分析器并衡量您的改进。不要仅仅因为它看起来可能更快就选择一个选项。这也看起来像 UI 代码:与实际绘制 UI 相比,UI 代码中的所有内容都很便宜,而且缓慢的位必须真的在任何人注意到之前都很慢,所以不用担心
-
不考虑设计,我发现第二个选项更直观、更干净、更易于维护和更合适。更多面向对象。由于C# 7,您可以pattern-match all 并将开关放在主开关中。这是第三个选项...
-
告诉我们你将如何进入
case Mode.CircleCenter:,但item不是Circle。 -
我的直觉是你在做这件事。项目本身的类型应该是
IShape,并且有一个采用模式参数的 Resize 方法。然后让班级自己照顾自己,而不是进行巨大的切换。
标签: c# if-statement switch-statement