2017-04-25 73 views
12

我的代碼,我得到3個消息都說object initialization can be simplified,在我的知識不斷增長的渴求(和我的OCD),我想「修理」我的代碼,這些消息不出現。我知道我可以只設置它,以便這些信息不出現,但我仍然會在我的頭上,他們是有其犯規背景坐的權利和我在一起。如果任何人都可以指出如何「簡化初始化」,這將是巨大的,所以我可以提高我的技能。如果需要更多的代碼,讓我知道,我可以將它添加對象初始化可以簡化

1:

TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);//issue on this line 
node.Tag = drive; 

第二:

DirectoryInfo di = new DirectoryInfo(dir); 
TreeNode node = new TreeNode(di.Name, 0, 1); //this line 

我的TreeNodes,懷疑它,因爲我有給他們相同的名字,但我試圖改變名字,但沒有什麼區別。

3:

OleDbCommand select = new OleDbCommand();//this line 
select.Connection = cnDTC; 
select.CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2); 
+3

好奇心和願意提高技能+1;) –

回答

15

1:

var node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage) { 
    Tag = drive 
}; 

第二:

var node = new TreeNode(new DirectoryInfo(dir), 0, 1); 

3:

var select = new OleDbCommand(string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2), cnDTC); 

第3(用繩子插值):

var select = new OleDbCommand($"SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({strSQL2})", cnDTC); 

BTW:每當出現這類消息時,嘗試把光標放在該行並按下「Ctrl +。」 (或單擊出現的燈泡) - 這開闢了「速戰速決/快速重構」

var進一步閱讀(這真的不是邪惡;))和 一些更多的文檔關於object- and collection-initializers

+0

謝謝,但我不知道爲什麼'var'比實際給它的類型更簡單,因爲我的理解'var'用於不同類型? – WhatsThePoint

+5

不,絕對沒有,繼續閱讀鏈接的文章,它只是一個「捷徑」。 (嘗試將mousecursor放在var聲明中,這會給你確切的推斷類型 var!= variant !!!! :) –

+0

和btw,你打開你的應用程序的sql注入通過使用string.Format 。 ^^ > https://en.wikipedia.org/wiki/SQL_injection –

2

我想這些消息只是想讓你使用floowing語法:

var select = new OleDbCommand 
{ 
    Connection = cnDTC, 
    CommandText = string.Format("SELECT MAX(VERSION_NO) AS MAX_VERSION FROM ({0})", strSQL2) 
}; 

這是你的第三個案例。

2

我類似的問題與此代碼:

 Customer oCust = new Customer(); 
     oCust.Address = txtAddress.Text; 
     oCust.City = txtCity.Text; 
     oCust.State = txtState.Text; 

而與此代碼解決了這個問題:

 Customer oCust = new Customer() 
     { 
      Address = txtAddress.Text, 
      City = txtCity.Text, 
      State = txtState.Text 
     }; 

的sooo ...到t甕關閉警告消息(IDE0017)(在2017年VS):
點擊工具標籤。然後再往選項...
然後| TextEditor | C#| CodeStyle |一般|
Expressoin喜好變化身高對象初始化沒有

+0

獲取它的所有具有多個屬性分配給它,它只是想在括號內加上括號 – WhatsThePoint

12

儘管以前的所有建議都很好,但我還是會添加第三種方法。關掉這些警告並忽略它們。儘管我很欣賞微軟試圖讓每個人都高效而整齊地編碼,但在我看來這並不是一個好建議,而且它實際上很難讀取和編輯代碼。首先,這基本上將對象初始化轉換爲單行代碼,並且任何錯誤都如此報告。如果您將20位數據加載到對象中,則會在第一行顯示錯誤,而不會告知哪些屬性發生了錯誤。調試不會有幫助,因爲您將整塊代碼顯示爲錯誤。其次,如果將來需要擴展代碼併爲特定屬性添加其他代碼,則現在需要在單獨的代碼中執行此操作。這增加了碎片並分離了相關的代碼(也許,這是有爭議的)。

這兩個問題可能看起來都是非常小的事情,但警告表明修復也是非常次要的事情。爲了加入初始化,您已使代碼難以調試和修改。在我看來這是一個糟糕的交易。

您可以通過右鍵單擊警告並選擇「禁止」,或轉到工具>選項>文本編輯器>代碼樣式>常規>首選對象初始化程序>來禁用警告,並將警告設置爲無。

+1

我在問題中提到我並不想要關閉消息 – WhatsThePoint

+1

我不希望投票,但是我想讓這個讓所有人都在解決方案中漫步,因爲它對我來說就像是第一個結果:) – tonyenkiducx

+1

謝謝,這個幫助很大。我最終將「首選項」更改爲「否」,而不是將「嚴重性」更改爲「建議」,以便在代碼與默認值相反時得到建議。 – Todd

0

我喜歡@tonyenkiducx answer,但我覺得好像有些應該討論的更大的想法。

根據我的經驗,Visual Studio提供的重構建議沒有幫助。我認爲要考慮的更大的問題是代碼設計是否正確。在面向對象的Propgramming中,一個接一個地設置屬性可能違反封裝。這個想法是,在任何成員被訪問/調用之後,對象應該始終處於有效狀態,直到對象被銷燬。在這種情況下,每個屬性設置後,狀態應該是有效的。正確的封裝將導致整體改進的軟件應用程序,因爲你正在增加其凝聚力。

object initialization can be simplified消息可能是在你的代碼檢測點有用的,你可以使用一個Creational Pattern,在事件封裝被破壞:

  • 抽象工廠模式
  • Builder模式
  • 工廠方法模式
  • 原型圖案

T他允許我們通過@tonyenkiducx解決提出了擔憂:

首先,這實質上是將對象初始化成一行代碼,任何錯誤報告等。如果您將20位數據加載到對象中,則會在第一行顯示錯誤,而不會告知哪些屬性發生了錯誤。調試不會有幫助,因爲您將整塊代碼顯示爲錯誤。其次,如果將來需要擴展代碼併爲特定屬性添加其他代碼,則現在需要在單獨的代碼中執行此操作。這增加了碎片並分離了相關的代碼(也許,這是有爭議的)。

因此,我們建議您考慮使用創建模式,而不是內聯對象被消耗的實例化,這是Visual Studio經常提出的建議。這可能不會刪除簡化消息,但在這一點上,您已仔細考慮了該消息標誌並可以安全地將其禁用。