为什么with()构造不包含在C#中,当它在VB.NET中真的很酷时?
-
07-07-2019 - |
题
我是C#开发人员。我非常喜欢花括号,因为我来自C,C ++和Java背景。但是,我也喜欢.NET系列的其他编程语言,比如VB.NET。如果你在.NET中编程了一段时间,那么在C#和VB.NET之间来回切换并不是什么大不了的事。这是我工作的公司非常常见的方法。作为C#的人,我非常喜欢VB.NET编译器提供的XML文字和以及
关键字。我希望微软也将这些功能包含在C#中。
我只是好奇,其他开发者对此有何评价!
解决方案
如果“With”,我不会感到惊讶或者类似的功能最终被添加到C#以及其他迄今流行的专用VB功能。最近在PDC和其他地方的C#4.0预览演示中有很多关于增加“关注语言平等”的讨论。从C#4.0和VB 10开始。
其他提示
在构造之后使用它时我个人不喜欢WITH - 如果你需要在初始化之后对一个对象做几件事,通常这个行为应该封装在类型本身中。如果你真的想做像WITH这样的事情,那只需要声明一个简短的变量并选择引入一个新的范围。
但是, 对于能够紧凑地初始化具有多个属性的对象非常有用 - 这正是C#3允许您编写的原因:
MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 };
这有一些限制(C#4中的可选参数和命名参数将有助于克服),但它比没有导致潜在的混乱/歧义更好。
(在XML文字方面,我再次与C#团队合作 - XML是一种非常具体的技术,可用于语言。如果他们能够提出一个通用的形式创建XML但也可以用来创建其他树,这很好 - 就像查询表达式没有直接绑定到IEnumerable或IQueryable一样。)
您可以通过创建快速单字母变量名来替换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#的哲学似乎大致相同。但在这种情况下,这里的回答似乎表明,与一个对我来说非常类似于lambdas的构造相比,添加(并使自己负责)变量是一件好事。
我觉得在初始化期间只允许'mass'属性设置是相当随意的。我真的不明白为什么这会是'糟糕':
MyObj myObj = ObjFactoryFunction();
...
if(someCondition)
myObj { Prop1 = 1, Prop2 = 2 };
我觉得这个示例代码简洁明了。
通常当我在C#中看到带
功能的请求时,我会看到可以从重构中受益的代码。通常在重构完成后, 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
但似乎很适合我已经拥有的语言。