2010-03-27 64 views
0

確定這樣的標題可能已經被混淆,所以我已經發布了2個代碼片段來說明我的意思添加對象的集合。聲明並創建一個對象,然後加入收藏VS使用new關鍵字來創建對象

注意:allUsers只是一個集合。

RegularUser regUser = new RegularUser(userName, password, name, emailAddress); 
     allUsers.Add(regUser); 

VS

 allUsers.Add(new RegularUser(userName, password, name, emailAddress)); 
  1. 哪個片斷A或B更好,爲什麼?
  2. 有什麼優點或缺點?
  3. 我寫的例子是C#但語言(C#,Java等)有所作爲?

回答

0

1)哪個片段A或B更好,爲什麼?

他們真的一模一樣。編譯後的代碼將幾乎完全相同,因爲臨時對象被壓入堆棧,然後用於方法調用。

2)有什麼優點或缺點?

該方法的主要優點和缺點僅僅是可讀性。

您的第一個示例具有保持每行代碼的單個「操作」的優點,這在許多方面都更易於維護。

第二個示例刪除不必要的變量聲明,該聲明可能更易於維護。

就我個人而言,我覺得您的RegularUser構造函數中的參數數量可能會推動我,在這種情況下,朝着您的第一個選項。我通常會發現,當一行代碼在平均顯示器上的顯示寬度大於半屏時,閱讀和理解它是否被分割更容易。通過引入臨時功能並分別呼叫添加來將其分開,這使得這一點更加清晰。但是,如果你只是添加一個很小的整數或類,我可能會投票跳過不必要的變量。然而,這完全是個人偏好 - 你的milage可能(也可能會)會有所不同。

3)我寫的例子是C#,但語言(C#,Java等)有所作爲?

不,大部分。這實際上取決於語言/實現,但在這兩種情況下,大多數語言都具有相同的基本行爲和性能。有些語言可能(而且很可能)會以不同的方式對待,但大多數主流語言不會。

+0

我喜歡你在可讀性方面所說的話。 – ZeeMan 2010-03-27 00:14:14

+0

@ZeeMan:謝謝。這實際上是兩者之間的唯一區別。編譯後的IL基本相同。 – 2010-03-27 00:18:24

0

我真的很喜歡用第一種方式創造它們,除非我真的知道發生了什麼。如果你不先創建對象,那麼要做調試要困難得多......

無論如何,編譯器只會將第二個版本轉換成第一個版本,所以不會產生淨負面影響。

優點的#1:(!)

  • 容易調試
  • 理論上更容易閱讀,更清晰
  • 可以使用對象後

缺點:

  • 更詳細
  • 可以是不必要的,尤其是對於瑣碎對象

結果:

  • 1爲任何複雜的創建,或者可能需要在調試時
  • 2容易地檢查對許多煩人小東西,如下所示。

var list = new List<NameValuePair>(3); 
list.Add(new NameValuePair("name", "valuable"); 
list.add(new NameValuePair("age", "valuable"); 
list.add(new NameValuePair("height", "not valuable"); 

var dates = new List<date>(); 
dates.Add(DateTime.Now()); 
dates.Add(DateTime.Now().Date().AddYears(-2)); 

,當談到這個據我所知,沒有語言之間的真正區別。雖然有些人可能不會允許。

2

就C#而言,您的兩個代碼示例在IL級別實際上是相同的。第二個例子仍創建一個對創建對象的引用並將其推入堆棧,但您沒有連接到本地變量。這不會造成任何性能問題。

+0

正是我在找的答案。 是的,我知道我沒有一個局部變量掛鉤,在這種情況下,我並不需要一個,因此我想知道是反正兩個不同的代碼。 我認爲唯一的優點是代碼片段B的代碼較少,儘管第一個代碼片段可能更易於理解。 – ZeeMan 2010-03-27 00:12:11

+0

這是怎麼回答的?我們所知道的只是IL是一樣的,做它們的原因是不同的。 – 2010-03-27 00:13:01

0

兩者在性能上是相同的。

在可維護性方面,第二種情況是一場噩夢,它幾乎不可能在調試器中跟蹤。所以我傾向於選擇第一個。在我早期的日子裏,我總是寫第二個,因爲「我知道他們是對象,我很善於抓住物體,所以我......等等等等,但是隨着時間的推移,特別是維修時間就會消失」

此外,假設有人想你

FilterClass.FilterUser(regUser) 

Database.AddToDatabase(regUser) 

,因爲它是這樣做的,第一個方案是更好的地方了。

最後,你什麼時候停下來?

allUsers.Add(new RegularUser(new ReadFromInput(new EscapedName(new Name(new String(userName)))), password, name, emailAddress));