簡體   English   中英

用is和as進行C#強制轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM