簡體   English   中英

使用對象類型作為參數

[英]Using object type as a parameter

我一直在想:您是否支持在方法中僅使用一個對象作為參數? 我這樣做的原因是超載。 當前,我正在嘗試創建一種可滿足許多不同數據類型的方法: stringdecimalDateTime ...列表繼續進行。

雖然有點混亂,所以我在考慮做以下事情

public void GenericMethod(object val)
{
    if (val is string)
        // process as string
    else if (val is decimal)
        // process as decimal
    else if (val is DateTime)
        // do something for dt
    else
        // ...
}

您如何看待這種方法? 會產生不必要的開銷嗎? (在類型檢查期間)您實現了嗎? 告訴我...

編輯:是的,只是一個旁注,我對重載有點熟悉。 但是當有超過10個重載時,它會有點煩人...

是的,那行得通。 但是,有更好的方法可以做到這一點。

最好的選擇是使用重載:

public void GenericMethod(string val)
{
        // process as string
}
public void GenericMethod(decimal val)
{
    // process as decimal
}

等等

每當您在代碼中使用is關鍵字時,就很可能暗示您可能忘記使用一些重要的OO原則:重載,子類等。

實際上,重載並不是很煩人,只是編寫即可。 請記住,您今天不是自己編寫代碼,而是三個月后才需要自己編寫代碼,這時您必須閱讀代碼並弄清楚為什么這樣做是錯誤的,或者在世界范圍內出現錯誤從。

避免“切換類型”技術的另一個原因是與.NET框架保持一致(因此也符合人們的期望)。 遵循Console.Write以及在給定類之內和之下重寫的其他各種方法。

我一直在想:您是否支持在方法中僅使用一個對象作為參數?

非常稀有。 如果有一組固定的類型得到適當的支持-否則您將引發異常-然后我將使用重載。

如果您實際上可以接受任何類型,並且將以某種眾所周知的方式處理非特殊支持的類型,那么可以接受object 這就是LINQ to XML到處都在做的事情,結果是一個非常干凈的API。 不過,我會非常謹慎地進行操作-這絕不是一個好主意。

是的,會有開銷。 不過,我通常不會以此為依據-開銷很小,在大多數情況下可以忽略不計。 盡可能干凈地設計API,然后弄清楚是否會造成瓶頸。

是的,這將導致類型檢查和裝箱/拆箱值類型的開銷。 我建議重載。

只要您不對數字做很多數學運算,另一種可能性就是使其成為通用方法。 但是,對於泛型而言,算術相當困難,因為對於值類型沒有任何限制,可以使用運算符。

不需要那些!

只需聲明任意多個具有相同名稱的方法,並在每種方法中將每種類型作為參數即可。[這稱為重載。 例如,您可能已經看到Method旁邊的+1 Overloads ,這意味着還有1個具有相同名稱但參數類型不同的Method]

像這樣說:

void Method(decimal d)
{
    //Process Decimal
}
void Method(string s)
{
    //Process String
}

默認情況下,它將根據類型查找自己的方法。

在某些情況下,您的方法有意義。 我以前使用過它,大多數情況下是在處理一堆對於不同數據類型相同的處理時。

但這不是過載。 重載將為相同的方法名稱定義不同的簽名,如下所示:

public void GenericMethod(string val)
{
    // process as string
}

public void GenericMethod(decimal val)
{
    // process as decimal
}

public void GenericMethod(DateTime val)
{
    // do something for dt
}

// Etc.

在某些情況下,這種方法更有意義。

實施許多重載其中一個需要object是沒有問題的。 看一下Console.WriteLine重載。 http://msdn.microsoft.com/zh-cn/library/system.console.writeline.aspx但是,請注意,例如int可能與double沖突:

int sum(int i, int j)
{
 return i + j;
}

double sum(double i, double j)
{
 return i + j;
}

object sum(object i, object j)
{
  return i.ToString() + j.ToString();
}

==============================

static void Main()
{
   sum(1, 2); // Error: ambigous call between `int` and `double` versions
   sum(1.0, 2.0); // calls double version, although 1.0 and 2.0 are objects too
   sum("Hello", "World"); // object
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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