我看到了下面的代碼,C# - 這是檢查有必要「obj是人&& OBJ!= NULL」
public override bool Equals(object obj)
{
// From the book http://www.amazon.co.uk/Pro-2010-NET-4-0-Platform/dp/1430225491
// Page 254!
if (obj is Person && obj != null)
...
}
根據我的理解,我認爲該代碼應被重寫如下:
public override bool Equals(object obj)
{
if (obj is Person)
...
}
這是正確的嗎?
基於http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx
An是表達式評估爲真,如果所提供的表達爲非空,並且所提供的對象可以被強制轉換爲提供的類型而不會導致拋出異常。
我認爲額外檢查null是沒有必要的。換句話說,該代碼「obj!= null」根本不應該被打中。
謝謝
// //更新
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Employee
{
public static void CheckIsEmployee(object obj)
{
if (obj is Employee)
{
Console.WriteLine("this is an employee");
}
else if (obj == null)
{
Console.WriteLine("this is null");
}
else
{
Console.WriteLine("this is Not an employee");
}
}
}
class NotEmployee
{ }
class Program
{
static void Main(string[] args)
{
Employee e = new Employee();
Employee.CheckIsEmployee(e);
Employee f = null;
Employee.CheckIsEmployee(f);
NotEmployee g = new NotEmployee();
Employee.CheckIsEmployee(g);
}
}
}
輸出結果:
this is an employee
this is null
this is Not an employee
取決於'is'的定義是什麼;-)在.NET的情況下,as'在內部執行'is'並且如果'is'爲false,則將結果設置爲'null'。如果有時可能會出現'null',jlew的解決方案會更加優化。 – 2011-05-05 17:01:25
@Eric J:D.使用'as'的原因主要是稍後使用類型化實例。因此,在jlew的解決方案中,你可能(可能)需要在確定它不是null之後將'obj'作爲'Person'來投射,這樣你才能完成Equals評估的其餘部分。保存相同結果的一行或兩行代碼。 – Thomas 2011-05-05 17:08:08