我是C#開發人員。我非常喜歡花括號,因爲我來自C,C++和Java背景。但是,我也喜歡.NET家族的其他編程語言,如VB.NET。在C#和VB.NET之間來回切換並不是什麼大事,如果你在.NET中編程了一段時間。在我工作的公司裏,這是非常普遍的做法。作爲C#的人,我非常喜歡XML文字和由VB.NET編譯器提供的關鍵字with
。我希望微軟也將這些功能包含在C#中。爲什麼with()構造不包含在C#中,當它在VB.NET中非常酷時?
我只是好奇,還有什麼其他開發者要說的!
我是C#開發人員。我非常喜歡花括號,因爲我來自C,C++和Java背景。但是,我也喜歡.NET家族的其他編程語言,如VB.NET。在C#和VB.NET之間來回切換並不是什麼大事,如果你在.NET中編程了一段時間。在我工作的公司裏,這是非常普遍的做法。作爲C#的人,我非常喜歡XML文字和由VB.NET編譯器提供的關鍵字with
。我希望微軟也將這些功能包含在C#中。爲什麼with()構造不包含在C#中,當它在VB.NET中非常酷時?
我只是好奇,還有什麼其他開發者要說的!
如果「With」或類似功能最終與其他迄今流行的VB功能一起添加到C#中,我不會感到驚訝。最近在C#4.0預覽演示中有很多討論PDC和其他地方以C#4.0和VB 10開始的「關注語言奇偶校驗」。
就個人而言,我不喜歡在構建後使用它 - 如果在初始化後需要用對象做幾件事情,通常應該將該行爲封裝在類型本身中。如果你真的想做一些像WITH這樣的事情,只需要聲明一個簡短的變量並且可以引入一個新的範圍。
然而,是很有用,能夠緊湊地初始化一個對象,具有幾個特性 - 這也正是爲什麼C#3,您可以這樣寫:
MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 };
有這個限制(其中可選並且C#4中的命名參數將有助於克服),但它比沒有導致潛在的混亂/歧義更好。 (在XML文字方面,我再次與C#團隊 - XML是一種非常具體的技術,如果他們能夠想出一個廣義的表單,它恰巧創建了XML,但可以也可以用來創建其他樹,這很好 - 就像查詢表達式不直接綁定到IEnumerable或IQueryable一樣。)
完全同意您對XML文字的評論。 +1 – 2009-01-09 22:43:27
XML是一種在.NET中使用的普遍技術,一切都使用它:(現在,如果他們讓Linq2Sql與非sqlserver數據庫一起工作,那麼您會有一個觀點:) – gbjbaanb 2009-01-10 00:54:46
您可以通過創建快速的單字母變量名來替換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
並不真的給你很多。
這是關於開發人員的偏好,但我與你約WITH。我的選擇是儘可能減少變量的數量以及它們所處的範圍。 C#的哲學看起來很相似。但在這種情況下,這裏的回答似乎表明,與對我而言,與lambda非常相似的構造相比,增加(並使自己負責)變量是一件好事。
我覺得在初始化過程中只允許'mass'屬性設置是相當隨意的。我真的不明白爲什麼這會是'壞':
MyObj myObj = ObjFactoryFunction();
...
if(someCondition)
myObj { Prop1 = 1, Prop2 = 2 };
我覺得這個例子代碼乾淨簡潔。
通常,當我在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
但似乎在自然適應的語言,我已經有。
我最喜歡的VB「額外」是異常時的when子句 - 例如。 「當x.code = 100時將x捕獲爲my_exception」或「在重試= 3時將x捕獲爲異常」 – gbjbaanb 2009-01-10 00:57:39