2

2つ以上のオプションから選択できるので、結果/結果が同じである場合、どちらを選択するかという質問につながります。

次の条件で.NET C# は、異なる演算子を使用して同じ質問をしているので、質問は、経験豊富な開発者が何を使用するかということEqualsです。

いつ、なぜあなたは「伝統的な」よりも、そして両方を選ぶ!Equalsです ==か?

//bool
if (!Page.IsPostBack) 
{
    //bool
    if (NotAuthorized().Equals(false)) 
    {            
        AppsCtrls.DDLs_Init();

        //bool
        if (CurrSeSn.Raised(Flag.MainDataSet_IsPopulated) == false)
        {
            initALLDataSet(AllDataStColsSelectionMod.doneViaSP);
        }

        custid = RConv.Str2int(Request.QueryString["custid"]);
        username = GetTableData.AsString("name", "tblCustomers", "custid", custid);
    }
}
4

3 に答える 3

2

この質問はやや主観的です...

「私は、Equalsのような既製の演算子がより多くの処理アクションを実行すると想定する傾向があります。」

"いつ、なぜあなたは!を選択しますか?そして両方とも'従来の'=="

オブジェクトのインスタンスの一部としてのEqualsメソッドは、そのインスタンスが別のインスタンスと等しいかどうかをチェックするために使用されますが、==and!=演算子は静的であるため、どのオブジェクトインスタンスからもバインドされていません。代わりに、これらは2つの引数(通常は同じタイプ)を受け入れて比較する特別な静的メソッドのようなものです。

次の例を考えてみましょう。

public class CustomObject
{
    int someValue, anotherValue;    

    public bool Equals(CustomObject obj)
    {
        return (this.someValue == obj.someValue && this.anotherValue == obj.anotherValue);
    }

    public static bool operator ==(CustomObject a, CustomObject b)
    {
        return a.Equals(b);
    }

    public static bool operator !=(CustomObject a, CustomObject b)
    {
        return !(a == b);
    }
}

この例では、このメソッドを使用して、同じタイプの別のインスタンスに対するEquals値の比較結果を生成します。CustomObjectCustomObjectの演算子は、パラメーターオブジェクトの1つを呼び出すだけで、他のオブジェクトに対して同等性チェックを実行します。演算子は単にを否定し、反対の結果を生成します。したがって、とにかく両方ともそのメソッドを呼び出すため、パフォーマンスのオーバーヘッドはそれほど大きくありません。==Equals!=====!=Equals

ベストプラクティス:

条件が本質的にブール条件である場合、、、またはを使用する必要はありませんがEquals!=ブール条件を無効にするために==使用する必要があります。!

例えば:

if(IsPostBack) // this is good

if(IsPostBack == true) // this is unnecessary

if(!IsPostBack) // this is good

if(IsPostBack == false) // this is unnecessary

条件が本質的にブール値ではない場合、2つのブール値を比較している場合、列挙型、またはその他の値型を比較している場合は、またはを使用でき!=ます==

例えば:

if(a == b) // this is good

if(a != b) // this is good

条件が本質的にブール値ではなく、比較しているオブジェクトに==or!=演算子が実装されていない場合は、を使用Equalsできます。ジェネリックオブジェクトのタイプパラメータで表されるオブジェクトに実装されているかはコンパイル時にわからないため、ジェネリックでのおよびの使用は禁止されていることに注意してください。!===!===

例えば:

if(a.Equals(b)) //this is good

if(!a.Equals(b)) // this is good

if(a.Equals(b) == true) // this is unnecessary
于 2012-11-07T23:10:28.700 に答える
1

私は通常、最短のオプションを選択します。

if (!Page.IsPostBack)

または:

if (Authorized())

C# では if ステートメントで非ブール式を使用できないため、これは完全に明らかであり、余分な入力の理由はわかりません。

そうは言っても、これは純粋に慣習と好みの問題であり、ある形式を使用することによるパフォーマンス上の利点はありません。

これは、たとえば、 を使用できる C++ とは異なります。if (42)この場合、がブール値であるか他の型であるif (foo)かを確認するだけでは十分ではありません。そのシナリオでは、型を明確に見て意図を明確にすることができるfooため、条件チェック (つまり: ) を含めることが理にかなっている場合があります。if (foo == false)

于 2012-11-07T22:09:35.227 に答える
0

最初のものを使用してください。zero/null == false である C/C++ とは異なり、C# では boolean 値型のみが boolean 演算子で使用できます。

int i=1;
if (i) { .... }

コンパイルされないため、特に説明的な名前 (IsSomething、HasHappened、NotSomething など) を使用する場合は、ブール値の等価性を明示的にテストする必要はありません。

于 2012-11-07T22:14:07.083 に答える