20

在检查我的 Windows 移动设备上是否存在并启用了摄像头时,我遇到了一些我不明白的事情。

代码如下所示:

    public static bool CameraP(){

        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent;
    }

    public static bool CameraE()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent1()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent
              && Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent2()
    {
        return CameraP() && CameraE();
    }

当我调用CameraPresent2()它时返回 false(没有相机存在)。但是当我打电话时,CameraPresent1()我收到一个 MissingMethodException 并带有注释“找不到方法:get_CameraEnabled Microsoft.WindowsMo​​bile.Status.SystemState”。

CameraPresent1是否仅仅因为它们都是财产(在语言级别)而评估第二个术语?

还有什么可以解释行为差异的吗?

4

4 回答 4

31

不评估第二项。

第一项不被评估。

CameraPresent1()方法甚至没有开始执行。

第一次调用CameraPresent1()时,运行时必须将 MSIL 即时编译为本机代码。这需要解决所有的方法调用,即使是那些只能有条件地到达的方法调用。编译失败,出现MissingMethodException.

使用时,只有在第一次调用时才会编译CameraPresent2()对 getter 的调用,而这永远不会发生。CameraEnabledCameraE()

于 2011-03-08T14:02:59.547 回答
10

C# 规范第 7.12 节

和运算&&||称为条件逻辑运算符。它们也被称为“短路”逻辑运算符。

&&和运算符是 & 和 |的||条件版本 运营商:

  • 操作x && y对应于操作x & y,除了仅在is noty时才评估。xfalse

  • 操作x || y对应于操作x | y,除了仅在is noty时才评估。xtrue


也就是说,C# 规范保证当且仅当为真CameraE()时才会调用。 CameraP()

这可能是激进的编译器优化的问题,因此实际程序似乎违反了语言规范......


编辑:

是否可以设置断点并显示反汇编窗口以查看生成的确切代码?

于 2011-03-08T13:32:07.407 回答
5

只是一个疯狂的猜测,但这有可能是 JIT 编译问题吗?调用 CameraPresent1 时,是否尝试将调用 Microsoft.WindowsMo​​bile.Status.SystemState.CameraEnabled 映射到底层设备?由于找不到方法 get_CameraEnabled,因此整个函数失败并出现 MissingMethodException。

于 2011-03-08T14:00:08.287 回答
0

查看报告的问题,似乎没有任何意义。这两个版本应该是相同的。不过,我想知道这里的问题是否是相机 APIdynamic在某个时候正在使用,并且它正在尝试寻找true()/ false()/&运算符。这可能会说服它切换到bool逻辑:

public static bool CameraPresent1()
{
    return ((bool)Microsoft.WindowsMobile.Status.SystemState.CameraPresent)
          && ((bool)Microsoft.WindowsMobile.Status.SystemState.CameraEnabled);
}
于 2011-03-08T13:57:45.323 回答