10

我是 C# 开发人员。我真的很喜欢花括号,因为我来自 C、C++ 和 Java 背景。但是,我也喜欢 .NET 系列的其他编程语言,例如 VB.NET。如果您已经在 .NET 中编程了一段时间,那么在 C# 和 VB.NET 之间来回切换并不是什么大问题。这在我工作的公司中是非常普遍的做法。作为 C# 人,我非常喜欢withVB.NET 编译器提供的 XML 文字和关键字。我希望微软也将这些功能包含在 C# 中。

我只是好奇,其他开发人员对此有何评论!

4

6 回答 6

16

就我个人而言,我不喜欢在构造之后使用 WITH ——如果在初始化后需要对对象执行几项操作,通常该行为应该封装在类型本身中。如果您真的想做 WITH 之类的事情,只需声明一个短变量并可选地引入一个新范围。

但是,能够紧凑地初始化具有多个属性的对象很有用——这正是 C# 3 允许您编写的原因

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

这有一些限制(C# 4 中的可选参数和命名参数将有助于克服这些限制),但它比没有导致潜在的混乱/歧义要好。

(在 XML 文字方面,我再次与 C# 团队合作 - XML 是一种非常具体的技术,可以放入语言中。如果他们能想出一个通用的形式,恰好可以创建 XML,但可以用来创建其他树这也很好——就像查询表达式不直接绑定到 IEnumerable 或 IQueryable 一样。)

于 2009-01-09T21:59:03.263 回答
3

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并没有真正给你太多。

于 2009-01-09T22:17:16.737 回答
1

这是关于开发人员的偏好,但我同意你的意见。我的偏好是尽量减少变量的数量,以及它们所处的范围。C# 的哲学似乎大同小异。但是在这种情况下,这里的响应似乎表明添加(并让自己负责)一个变量是一件好事,与对我来说与 lambda 非常相似的构造相比。

于 2009-01-09T22:24:56.457 回答
1

我觉得在初始化期间只允许“质量”属性设置是相当随意的。我真的不明白为什么这会是“坏的”:

MyObj myObj = ObjFactoryFunction();

...

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

我觉得这个示例代码干净简洁。

于 2009-01-10T00:53:57.233 回答
1

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,但似乎很自然地适合我已经拥有的语言。

于 2009-01-12T07:47:45.353 回答
0

如果最终将“With”或类似功能与其他迄今为止流行的专有 VB 功能一起添加到 C# 中,我不会感到惊讶。最近在 PDC 和其他地方的 C# 4.0 预览演示文稿中有很多关于从 C# 4.0 和 VB 10 开始增加的“关注语言奇偶校验”的讨论。

于 2009-01-12T05:01:12.833 回答