我正在使用一个具有以下成员变量的类
class SomeClass
{
int idx0_value;
int idx1_value;
int idx2_value;
//...
}
我无法改变这个班的结构。
我使用这个类的一个实例来检查以前选择的索引,并使用一些if-else
语句为变量分配相应的值:
if(indexIFoundEarlier == 0)
valueIWant = aSomeClass.idx0_value;
else if(indexIFoundEarlier == 1)
valueIWant = aSomeClass.idx1_value;
else
valueIWant = aSomeClass.idx2_value;
这似乎相当低效。
在C++中,我可以有效地存储对相关成员的引用,但在C#中,这是不可能的,我已经阅读了关于它的各种线程。
在不改变"SomeClass"的结构的情况下,有没有更好(阅读更高效)的方式来缓存我所做的选择?
您可以使用委托。。。
class SomeClass {
int idx0_value;
int idx1_value;
int idx2_value;
private Func<int> selection;
private void SetSelection( int choice ) {
switch( choice ) {
case 0:
selection = () => idx0_value;
break;
case 1:
selection = () => idx1_value;
break;
case 2:
selection = () => idx2_value;
break;
}
}
private int GetSelectionAgain() {
return selection?.Invoke() ?? -1;
}
}
然而,这似乎相当低效。在C++中,我可以有效地存储对相关成员的引用,但在C#中,这不是可能的话,我已经阅读了关于这方面的各种线索。
在我看来,在这种情况下,使用switch语句是唯一合理的选择。使用反射或任何类型的委派的开销都将远远高于只执行if-else
语句或switch
语句。
//same concept as what you posted but as a switch statement
switch( indexIFoundEarlier )
{
case 0:
valueIWant = idx0_value;
break;
case 1:
valueIWant = idx1_value;
break;
default:
valueIWant = idx2_value;
break;
}
我会使用一个扩展。它有效吗?这是主观的,直到它被比作某种东西。但它是可读的,这很重要。如果你的逻辑很简单,有人来了,发现它是以一种复杂的方式完成的,首先他们会读几遍,假设他们一定遗漏了什么。然后,当他们意识到这是在做一些简单的事情时,他们可能会想为什么不简单地做。
重构代码时总是会发生这种情况。我们遇到了一些复杂的东西(甚至可能是我们写下却忘记的东西),当我们理解它时,我们会对自己说:"这就是它的全部作用吗?"然后用更简单的东西代替它。
public static class SomeClassExtensions
{
public static int GetValueFromIndex(this SomeClass someClass, int index)
{
if(index == 0) return someClass.idx0_value;
if(index == 1) return someClass.idx1_value;
return someClass.idx2_value;
}
}
var value = aSomeClass.GetValueFromIndex(indexIFoundEarlier);