如何使用 switch 语句来比较引用

WDU*_*DUK 0 c#

我正在尝试匹配对结构中字段的引用,但我不确定如何将其作为案例设置而不是 if 语句来执行。

这是我对 if 语句所做的一般想法:

public struct Test
{
   // MyObject is a class
   public MyObject A;
   public MyObject B;
   public MyObject C;

   public bool Distance(MyObject obj, out float distance){
        distance = float.PositiveInfinity;
        if(A == obj){
         distance = DistanceFrom(A);
         return true;
        }
        if(B == obj){
         distance = DistanceFrom(B);
         return true;
        }
        if(C == obj){
         distance = DistanceFrom(C); 
         return true;
        }
        //object does not relate to this struct so return false
        return false;
   }
}
Run Code Online (Sandbox Code Playgroud)

我的实际结构中有超过 3 个(总共 24 个),但我想知道如何通过 case 语句进行比较,因为它比许多 if 语句要干净得多。另外,我不希望使用 24 个引用的列表,因此使用一个简单的 for 循环来运行它,因为我最终会将结构分配到堆。

是否可以进行比较参考的切换?我知道如何按对象类型进行比较,但如果它们引用完全相同的对象,则不知道。或者 if 语句是我唯一的选择吗?

Kit*_*Kit 5

虽然我同意评论者的观点,即您可能存在设计问题,但您可以使用when带有switch.

public bool Distance(object obj, out float distance)
{
    switch (obj)
    {
        case var _ when ReferenceEquals(obj, A):
            distance = DistanceFrom(A);
            return true;
        case var _ when ReferenceEquals(obj, B):
            distance = DistanceFrom(B);
            return true;
        case var _ when ReferenceEquals(obj, C):
            distance = DistanceFrom(C);
            return true;
        default:
            distance = float.PositiveInfinity;
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道它看起来有点奇怪,但var _是一个丢弃,表示您不关心obj( 至少其case本身的价值,但您仍然可以objwhen.

您说过您想比较参考文献。就是这样ReferenceEquals。如果您不想这样,您可以使用==或任何您认为平等的方式。