如何在C#中保存对成员变量的选择?
我正在使用一个包含以下成员变量的类如何在C#中保存对成员变量的选择?,c#,reference,C#,Reference,我正在使用一个包含以下成员变量的类 class SomeClass { int idx0_value; int idx1_value; int idx2_value; //... } 我不能改变这个班的结构 我正在使用此类的一个实例来对照以前选择的索引进行检查,并使用一些if-else语句为变量指定相应的值: if(indexIFoundEarlier == 0) valueIWant = aSomeClass.idx0_value;
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;
}
}
class-SomeClass{
int idx0_值;
int idx1_值;
int idx2_值;
私有函数选择;
私人选举(整数选择){
开关(选择){
案例0:
选择=()=>idx0_值;
打破
案例1:
选择=()=>idx1_值;
打破
案例2:
选择=()=>idx2_值;
打破
}
}
private int GetSelectionAgain(){
返回选择?.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);
看看decorator设计模式。如果效率不是一个大问题,那么您可以始终使用反射。关于堆栈溢出,有很多问题讨论在运行时以编程方式选择和访问对象成员。在您的特定示例中,使用反射或制作访问器委托的字典可能是合适的,但这样一个措辞模糊的问题是不可能知道的。请提供一个很好的例子,清楚地展示您的场景,解释您已经研究过的具体技术,以及您在实现一种或多种技术时遇到的具体问题。不要开玩笑-您不是通过将其存储在
valueIWant
中来“缓存选择”吗?