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