如何决定BOOL操作员的使用情况,性能问题与可读性



有两个以上的选项可供选择,引导我质疑哪一个,如果结果/结果相同。

.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);
    }
}

这个问题有点主观...

"我倾向于假设现成的操作员像等于 通过更多的处理动作。"

"您何时以及为什么选择! '传统'=="

作为对象实例的Equals方法,用于检查该实例相对于另一个实例的平等性,而==!=运算符是静态的,因此与任何对象实例都不限制。相反,这些就像一种特殊的静态方法,它接受两个参数(通常是相同类型)并进行比较。

考虑以下示例:

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中值与同一类型的另一个实例的比较结果。==自定义Objject的操作员只需在一个参数对象上调用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

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

例如:

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

如果条件本质上不是布尔值,并且要比较的对象没有实现的==!=操作员,则可以接受使用Equals注意,使用!===禁止使用仿制药,因为在编译时不知道!===在仿制药对象类型参数表示的对象上实现。

例如:

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

我通常选择最短的选项,即:

if (!Page.IsPostBack)

或:

if (Authorized())

由于C#不允许在IF语句中进行非树树表达式,因此这很清楚,因此我认为没有额外打字的理由。

话虽如此,这确实是惯例和偏好的问题 - 使用一种表格而不是另一种表格没有性能优势。

这与C 不同,例如,您可以使用if (42),在这种情况下,查看if (foo)不足以知道foo是布尔值还是其他类型。在这种情况下,偶尔包括条件检查(即:if (foo == false))是有意义的,因为您可以清楚地看到类型并使您的意图清晰。

使用第一个。与c/c 不同,其中零/null == false,在c#中,只能与布尔值类型一起使用,即:

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

不会编译,因此无需明确测试布尔值的平等,特别是在使用描述性名称(issomething,hashapped,notshate,notshath等)时。

相关内容

最新更新