2009-01-09 14 views
10

我是C#開發人員。我非常喜歡花括號,因爲我來自C,C++和Java背景。但是,我也喜歡.NET家族的其他編程語言,如VB.NET。在C#和VB.NET之間來回切換並不是什麼大事,如果你在.NET中編程了一段時間。在我工作的公司裏,這是非常普遍的做法。作爲C#的人,我非常喜歡XML文字和由VB.NET編譯器提供的關鍵字with。我希望微軟也將這些功能包含在C#中。爲什麼with()構造不包含在C#中,當它在VB.NET中非常酷時?

我只是好奇,還有什麼其他開發者要說的!

+2

我最喜歡的VB「額外」是異常時的when子句 - 例如。 「當x.code = 100時將x捕獲爲my_exception」或「在重試= 3時將x捕獲爲異常」 – gbjbaanb 2009-01-10 00:57:39

回答

0

如果「With」或類似功能最終與其他迄今流行的VB功能一起添加到C#中,我不會感到驚訝。最近在C#4.0預覽演示中有很多討論PDC和其他地方以C#4.0和VB 10開始的「關注語言奇偶校驗」。

16

就個人而言,我不喜歡在構建後使用它 - 如果在初始化後需要用對象做幾件事情,通常應該將該行爲封裝在類型本身中。如果你真的想做一些像WITH這樣的事情,只需要聲明一個簡短的變量並且可以引入一個新的範圍。

然而,很有用,能夠緊湊地初始化一個對象,具有幾個特性 - 這也正是爲什麼C#3,您可以這樣寫:

MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 }; 

有這個限制(其中可選並且C#4中的命名參數將有助於克服),但它比沒有導致潛在的混亂/歧義更好。 (在XML文字方面,我再次與C#團隊 - XML是一種非常具體的技術,如果他們能夠想出一個廣義的表單,它恰巧創建了XML,但可以也可以用來創建其他樹,這很好 - 就像查詢表達式不直接綁定到IEnumerable或IQueryable一樣。)

+0

完全同意您對XML文字的評論。 +1 – 2009-01-09 22:43:27

+0

XML是一種在.NET中使用的普遍技術,一切都使用它:(現在,如果他們讓Linq2Sql與非sqlserver數據庫一起工作,那麼您會有一個觀點:) – gbjbaanb 2009-01-10 00:54:46

3

您可以通過創建快速的單字母變量名來替換VB.Net的With。它實際上代碼較少,因爲With稍後還需要End With

例如,我曾經經常需要做的一件事是迭代數據表中的行以獲得控制/中斷樣式報告。

在vb.net,可能看起來像這樣的:

Dim CurCustomerName As String 
Dim CustomerSalesTotal As Decimal 

Dim ds As DataSet = GetReportData() 
With ds.Tables(0).Rows 
    Dim i As Integer = 0 
    While i < .Count 
     ''//{ 
     CurCustomerName = .Item(i)("CustName") 
     CustomerSalesTotal = 0 
     PrintHeaderLine(CurCustomerName) 

     While i < .Count AndAlso CurCustomerName = .Item(i)("CustName") 
      ''//{ 
      PrintItemLine(.Item(i)("OrderTotal")) 
      CustomerSalesTotal += .Item(i)("OrderTotal") 

      i+= 1 
     End While ''//} 
     PrintSubTotalLine(CustomerSalesTotal) 
    End While ''//} 
End With 

的C#是這樣的:

string CurCustomerName; 
Decimal CustomerSalesTotal; 

DataSet ds = GetReportData(); 
DataRowCollection r = ds.Tables[0].Rows; 
int i=0; 
while (i<r.Count) 
{ 
    CurCustomerName = r[i]["CustName"]; 
    CustomerSalesTotal = 0; 
    PrintHeaderLine(CurCustomerName); 

    while (i<r.Count && CurCustomerName == r[i]["CustName"]) 
    { 
     PrintItemLine(r[i]["OrderTotal"]); 
     CustomerSalesTotal += r[i]["OrderTotal"]; 

     i++; 
    } 
    PrintSubTotalLine(CustomerSalesTotal); 
} 

這裏需要注意的一點是,C#版本實際上需要較少的打字,因爲VB無法將WITH與數組索引結合起來,並且必須通過.Item屬性來完成某些操作。這不是什麼大不了的事在這裏,但想象一下,如果報告中有20場,而不是2,不得不對3項,而不是1

當然打破,你可以用C#證實了VB以及技術。但要注意的主要是WITH並不真的給你很多。

1

這是關於開發人員的偏好,但我與你約WITH。我的選擇是儘可能減少變量的數量以及它們所處的範圍。 C#的哲學看起來很相似。但在這種情況下,這裏的回答似乎表明,與對我而言,與lambda非常相似的構造相比,增加(並使自己負責)變量是一件好事。

1

我覺得在初始化過程中只允許'mass'屬性設置是相當隨意的。我真的不明白爲什麼這會是'壞':

MyObj myObj = ObjFactoryFunction(); 

... 

if(someCondition) 
    myObj { Prop1 = 1, Prop2 = 2 }; 

我覺得這個例子代碼乾淨簡潔。

1

通常,當我在C#中看到with功能的請求時, ,我看到了可以從重構中受益的代碼。通常當重構完成時,with的假設需求消失了。

我喜歡我的代碼的方式,當我建立一個流暢的接口到一個對象的方式;它與with有一些相似之處。如果我設計MessageBox.Show(),我可能會寫:

new MessageBox() 
    .SetText("Hello World!") 
    .SetButtons(MessageBox.Buttons.OK) 
    .SetIcon(MessageBox.Icon.Information) 
    .Show(); 

你也可以看到類似的LINQ:

var q = Enumerable.Range(1, 100) 
      .Where(x => x % 2 == 0) 
      .Select(x => x * x); 

這感覺有點像with但似乎在自然適應的語言,我已經有。