有两个以上的选项可供选择,引导我质疑哪一个,如果结果/结果相同。
在.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等)时。