1

如何检查实例类是否等于类中的变量?

public class ChainType
{
    public ChainType none;
    public ChainType unknown;
    public ChainType horizontal;
    public ChainType vertical;
    public ChainType centerCross;
    public ChainType leftTopCornerCross;
    public ChainType rightTopCornerCross;
    public ChainType leftBottomCornerCross;
    public ChainType rightBottomCornerCross;
}

public class aClass{
    ChainType chainType = new ChainType();

    someMethod(){
        chainType = getChainType(); // sets to chainType.horizontal

        if(chainType == ChainType.horizontal){..} // getting Error here about object reference to non-static class
    }
}
4

6 回答 6

1

如果你想这样做,你应该static在字段中添加修饰符ChainType

public class ChainType
{
    public static ChainType none;
    public static ChainType unknown;
    ...
    public static ChainType rightBottomCornerCross;
}

但我不认为它会解决你的问题。它会编译,但它不会工作。

chainType是指针,所以是无,未知,...。只有当您分配给链类型无,未知,...之一时,您才能以您的方式比较它。

枚举应该更好:

public enum ChainType
{
    none,
    unknown,
    ...
}

切换到枚举后无需更改代码。

编辑(“我正在尝试在这里遵循第 36 条提示。devmag.org.za/2012/07/12/”)

你得到这个错误的方式。Tip 36 说你应该为 Bullets 使用单独的变量而不是使用数组:

Bullet bulletTypeA
Bullet bulletTypeB
...

代替

Bullet[] bullets;
bullets[BulletType.A]
于 2013-07-18T07:33:06.000 回答
1

提示实际上是针对enums 的,所以让我们忘记这一点。

您的代码和示例之间存在细微差别。类名是Bullets,复数。您应该将您的班级名称更改为ChainTypes,您应该没问题。

public class ChainTypes
{
    public ChainType none;
    public ChainType unknown;
    public ChainType horizontal;
    public ChainType vertical;
    public ChainType centerCross;
    public ChainType leftTopCornerCross;
    public ChainType rightTopCornerCross;
    public ChainType leftBottomCornerCross;
    public ChainType rightBottomCornerCross;
}

ChainTypes types = new ChainTypes();
ChainType chaintype = getChainType();   
if (chainType == types.horizontal) {
}

我理解其中的原因,但这在比较中可能非常棘手(提示没有解决Bullets 的用法。比较是在引用上完成的,因此您必须将其设为ChainTypes静态并确保始终返回正确的实例。

于 2013-07-18T07:39:54.063 回答
0

首先:您必须将它们定义为静态的:

public class ChainType
{
    public static ChainType none; //STATIC !!
    ... 
}

所以你可以像ChainType.horizontal.

第二:注意一个事实,写代码就像

if(chainType == ChainType.horizontal){..}

比较这两个实例的引用,而不是他们的内容。如果这是您所期望的,请继续进行第一个修复,如果不是,您也必须为您的类型定义自定义相等比较器。

于 2013-07-18T07:34:02.620 回答
0

您应该为此目的使用枚举:

public enum ChainType
{
    none,
    unknown,
    horizontal,
    vertical,
    centerCross,
    leftTopCornerCross,
    rightTopCornerCross,
    leftBottomCornerCross,
    rightBottomCornerCross
}

public class aClass{
    ChainType chainType = ChainType.horizontal;

    someMethod(){

        if(chainType == ChainType.horizontal){..} 
    }
}
于 2013-07-18T07:35:11.443 回答
0

我不确定这是否是最好的方法。如果您使用这些类来定义什么是什么,那么我会推荐一个枚举。

如果在某种继承结构中需要它们,那么您应该比较 GetType() 或 typeof(object)。

最后,如果您需要测试两个对象是否相同(就像程序中的相同实际事物一样),那么您将丢失每个实例变量的初始化,并且您的 getChainType 应该返回其中一个实例。

于 2013-07-18T07:38:36.557 回答
0

所有答案都是正确的,大喊使用枚举(尽管这是最佳实践),但让我们看看错误,错误是不言自明的。您正在直接访问类的非静态属性(类不是它的对象) Insead 您可以尝试 chainType.horizo​​ntal (这里的 chainType 是 ChainType 类的对象)。

于 2013-07-18T07:44:36.113 回答