如何在C#中保存成员变量的选择



我正在使用一个具有以下成员变量的类

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);

最新更新