20

Windows Mobileユニットにカメラがあり、有効になっているかどうかを確認しているときに、理解できない問題が発生しました。

コードは次のようになります。

    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()、「メソッドが見つかりませんでした:get_CameraEnabledMicrosoft.WindowsMo​​bile.Status.SystemState」というコメント付きのMissingMethodExceptionが表示されます。

CameraPresent12番目の用語は両方とも(言語レベルで)プロパティであるという理由だけで評価されますか?

行動の違いを説明するものは他にありますか?

4

4 に答える 4

31

第2項は評価されません。

最初の項は評価されません。

メソッドはCameraPresent1()実行を開始しません。

CameraPresent1()初めて呼び出すとき、ランタイムはMSILをネイティブコードにJITコンパイルする必要があります。これには、条件付きでのみ到達する可能性のあるものも含め、すべてのメソッド呼び出しを解決する必要があります。コンパイルはで失敗しますMissingMethodException

を使用CameraPresent2()すると、のゲッターの呼び出しは、が初めて呼び出されCameraEnabledたときにのみコンパイルされCameraE()ます。これは決して発生しません。

于 2011-03-08T14:02:59.547 に答える
10

C#仕様セクション7.12

&&and||演算子は、条件付き論理演算子と呼ばれます。これらは「短絡」論理演算子とも呼ばれます。

&&and演算子は、&と|の||条件付きバージョンです。演算子:

  • 操作は操作x && yに対応しますがx & y、そうでないy場合にのみ評価されます。xfalse

  • 操作は操作x || yに対応しますがx | y、そうでないy場合にのみ評価されます。xtrue


つまり、C#仕様では、trueの場合にのみ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

報告された問題を見ると、意味がないようです。2つのバージョンは同一である必要があります。ただし、ここでの問題は、カメラAPIがdynamicある時点で使用されており、//演算子を検索しようとしていることであるか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 に答える