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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top