[英]c# casting with is and as
我需要協助。 這很容易。 我有這段代碼,我想討論一下它是否正確,或者您是否建議一種更好的方法。 我對答案有個想法,但我想看看您的答案。 它去了
if (myObject is ClassA)
{
var myObjectA = myObject as ClassA;
myObjectA?.MethodJustInA();
}
else if (myObject is ClassB)
{
var myObjectB = myObject as ClassB;
myObjectB?.MethodJustInB();
myObjectB?.OtherMethodJustInB();
}
我認為沒有必要在每次之后都創建一個新對象,只需這樣做:
(ClassB)myObjectB.MethodJustInB();
無需檢查它是否為null,因為它是否在if is之內,因為它不為null
謝謝
有一些優化可能。
myObject is ClassA
,則不需要進行強制轉換。 相反,您可以直接進行var myObjectA = (ClassA)myObject;
: var myObjectA = (ClassA)myObject;
。 ((ClassA)myObject)?.MethodJustInA();
。 myObject is ClassA
,如果myObject
為null, myObject is ClassA
計算結果為false,因此您無需再次進行檢查: ((ClassA)myObject).MethodJustInA();
。 所以:
if (myObject is ClassA)
{
((ClassA)myObject).MethodJustInA();
}
else if (myObject is ClassB)
{
var myObjectB = (ClassB)myObject;
myObjectB.MethodJustInB();
myObjectB.OtherMethodJustInB();
}
我更喜歡使用as
,然后檢查null
,這樣您可以跳過is
check。 另外,您不需要elvis運算符?.
因為您知道對象不是null。
var myObjectA = myObject as ClassA;
var myObjectB = myObject as ClassB;
if (myObjectA != null)
{
myObjectA.MethodJustInA();
}
else if (myObjectB != null)
{
myObjectB.MethodJustInB();
myObjectB.OtherMethodJustInB();
}
如果您正在測試多種類型,然后as
+ null
檢查是更有效的 (只是一個演員,而不是is
+鑄造):
var a = myObject as ClassA;
if (a != null)
a.MethodJustInA();
var b = myObject as ClassB;
if (b != null)
b.MethodJustInB();
在給定的情況下,我什至會像這樣使本地范圍
{
var obj = myObject as ClassA;
if (obj != null)
obj.MethodJustInA();
}
{
var obj = myObject as ClassB;
if (obj != null)
obj.MethodJustInB();
}
{ }
可以重用相同的變量名(更容易復制/粘貼,更方便閱讀)。
我有點匆忙,還沒有考慮else
情況(當myObject is ClassA
您不想將其強制轉換為b
等)。 通常,每次成功調用if
和相應的方法后,我都會return
。 我不能構造好看, if
/ else if
代碼。
另一個想法是使用C#6.0空條件運算符:
(myObject as ClassA)?.MethodJustInA();
(myObject as ClassB)?.MethodJustInB();
看起來確實很整潔,但是它將不必要地強制轉換為B
並具有副作用:如果ClassB
繼承了ClassA
,則將同時調用這兩種方法,因為兩種強制轉換都會成功。
注意:不幸的是,提到的副作用適用於所有建議的摘要。
如果您以這種方式使用它,則只需將其轉換為:
var myObjectA = (myObject as ClassA);
if (myObjectA != null)
{
myObjectA.MethodJustInA();
}
else
{
var myObjectB = (myObject as ClassB);
if (myObjectB != null)
{
myObjectB.MethodJustInB();
}
}
在C#7.0中,您可以執行以下操作:
if (myObject is ClassA myObjectA)
myObjectA.MethodJustInA();
else
if (myObject is ClassB myObjectB)
myObjectB.MethodJustInB();
在這些if
語句中,您可以像這樣強制轉換對象:
var myObjectB = (ClassB)myObject;
或直接投放:
((ClassB)myObject).MethodJustInB();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.