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 ,而且都超过 '传统' ==”

Equals方法作为对象实例的一部分用于检查该实例与另一个实例的相等性,而==and!=运算符是静态的,因此不受任何对象实例的约束。相反,它们就像一个特殊的静态方法,它接受两个参数(通常是相同的类型)并比较它们。

考虑以下示例:

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方法用于生成将 中的值CustomObject与相同类型的另一个实例进行比较的结果。==CustomObject的运算符只需调用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

如果条件本质上不是布尔值,或者您正在比较两个布尔值,或者您正在比较枚举或其他值类型,则使用!=or==是可以接受的。

例如:

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

使用第一个。与零/null == false 的 C/C++ 不同,在 C# 中,只有布尔值类型可以与布尔运算符一起使用,即:

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

不会编译,因此不需要显式测试布尔值的相等性,特别是在使用描述性名称(IsSomething、HasHappened、NotSomething 等)时

于 2012-11-07T22:14:07.083 回答