[英]Using object type as a parameter
我一直在想:您是否支持在方法中僅使用一個對象作為參數? 我這樣做的原因是超載。 當前,我正在嘗試創建一種可滿足許多不同數據類型的方法: string
, decimal
, DateTime
...列表繼續進行。
雖然有點混亂,所以我在考慮做以下事情
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.