0

以下のコードでは、ステートメントが整数の間にある場合、その比較方法がわかりませんか? C#.net で複製したい

Public Function QSBarcodeCheckLicenseVersion(ByRef eVersionToCheck As enmBC_LIC_Version) As Boolean
    Dim lLicense As Integer

    lLicense = 8

    **If lLicense And eVersionToCheck Then**
        QSBarcodeCheckLicenseVersion = True
    Else
        QSBarcodeCheckLicenseVersion = False
    End If

End Function

Public Enum enmBC_LIC_Version
    BC_LIC_DEMO = &H1
    BC_LIC_LINEAR = &H2
    BC_LIC_PDF417 = &H4
    BC_LIC_DATAM = &H8
End Enum
4

4 に答える 4

3

ビット単位が必要ですand

if ((ILicence & (int)eVersionToCheck) != 0)

実際の実装は次のようになります。

public bool QSBarcodeCheckLicenseVersion(enmBC_LIC_Version eVersionToCheck)
{ 
   Int32 lLicense = 8;

   return ((lLicense & (int)eVersionToCheck) != 0);            
}

ノート

ただし、@ SwDevMan81が彼の回答で示したように、列挙値のみを使用するようにメソッドを書き直すことができます。列挙型を使用する限り、それはおそらくより良い形式です!

こちらのデモ

于 2013-03-12T14:26:25.697 に答える
1

ビット単位の比較を行います。C#では、「&」を使用できます。

// Pseudo code
QSBarcodeCheckLicenseVersion = (lLicense & eVersionToCheck);

実際のバージョン:

void Main()
{
    enmBC_LIC_Version v = enmBC_LIC_Version.BC_LIC_LINEAR /*| enmBC_LIC_Version.BC_LIC_DATAM*/;
    bool outp = QSBarcodeCheckLicenseVersionFunc(v);
    Console.WriteLine(outp);
}

public bool QSBarcodeCheckLicenseVersionFunc(enmBC_LIC_Version eVersionToCheck)
{
    enmBC_LIC_Version lLicense = enmBC_LIC_Version.BC_LIC_DATAM;
    return ((lLicense & eVersionToCheck) == lLicense);
}

// Define other methods and classes here
[Flags]
public enum enmBC_LIC_Version
{
    BC_LIC_DEMO = 0x01,
    BC_LIC_LINEAR = 0x02,
    BC_LIC_PDF417 = 0x04,
    BC_LIC_DATAM = 0x08
}

.NET 4.0以降では、HasFlagを使用できます

return eVersionToCheck.HasFlag(lLicense);
于 2013-03-12T14:27:32.883 に答える
-1
Public bool QSBarcodeCheckLicenseVersion(enmBC_LIC_Version eVersionToCheck)
{
    int lLicense = 8;

    if ((lLicense & eVersionToCheck) != 0)
        return true;
    else
        return false;
}

Public enum enmBC_LIC_Version
{
    BC_LIC_DEMO = 1,
    BC_LIC_LINEAR = 2,
    BC_LIC_PDF417 = 4,
    BC_LIC_DATAM = 8
}

どうやらServyは正しいです。0==falseに基づいてintを直接boolと評価することを誓った可能性があります。どの言語で有効なのかわからない。

于 2013-03-12T14:27:46.517 に答える
-1

enmBC_LIC_Versionは列挙型であり、さまざまなリテラル値に派手な名前が付いた舞台裏の単なる整数です。このコードは、その数値と数値でビットごとの AND を実行しています8。8 は有効な列挙型の 1 つであるため、列挙型がそうでない場合、結果は 0 になりますBC_LIC_DATAM。つまり、列挙型が に設定されているかどうかを確認していBC_LIC_DATAMます。

C#&では、ビットごとの AND を使用するため、関数は次のようになります。

return (enmBC_LIC_Version.BC_LIC_DATAM & eVersionToCheck) != 0;

(コードを読みやすくするためenmBC_LIC_Version.BC_LIC_DATAMではなくを使用8したことに注意してください。)

于 2013-03-12T14:24:50.753 に答える