2009-03-02 119 views
24

我今天正在查看Infragistics控件库的在线帮助,并看到一些使用关键字的VB代码在选项卡控件上设置了多个属性。自从我完成任何VB编程已经有近10年了,我几乎忘记了这个关键字甚至存在。因为我对C#还比较陌生,所以我很快去看看它是否有类似的构造。可悲的是,我一直无法找到任何东西。C#中缺少'with'关键字

请问C#有一个关键字或类似的结构来模仿提供的功能关于VB的关键字吗?如果没有,为什么C#没有这个技术原因?

编辑:我在询问我的问题之前搜索了一个现有的条目,但没有找到一个Ray提到的(here)。为了完善这个问题,那么,为什么C#没有这个技术原因呢?并且Gulzar钉了它 - 不,没有技术原因为什么C#没有关键字。这是语言设计师的设计决定。

+0

(题外话,你问protobuf网 - 降我是[email protected]的电子邮件) – 2009-03-27 12:44:37

+0

除了Gulzar Nazim所说的之外,我还在一个会议上向Anders Helsburg问了这个问题。他的回答更加简洁。 'C#永远不会支持With关键字' – 2013-05-15 19:49:46

回答

22

这是C#项目经理说: Why doesn't C# have a 'with' statement?

  • 小或不存在的可读性的优点。我们认为可读性好处很小或不存在。我不会说,with语句使得代码不易读,但有些人可能会这样做。

  • 语言复杂度增加。添加with语句会使语言更加复杂。例如,VB必须添加新的语言语法来解决局部变量(Text)和“with”目标(.Text)上属性之间的潜在歧义。解决这个问题的其他方法也会引入语言复杂性。另一种方法是推送作用域并使该属性隐藏本地变量,但是如果不添加某种转义语法,则无法引用本地。

  • C++遗产。 C++从来没有一个with语句,缺乏这样的语句通常不被C++开发者认为是一个问题。另外,我们并没有感觉到其他变化 - 人们正在编写的代码类型的变化,平台中的变化,语言中的其他变化等 - - 更加必要的陈述。

+1

@Gulzar - 感谢您的链接。它'抓痒',虽然我不同意Wiltamuth先生的前两条推理。对于我来说,with关键字与可读性关系不大,因为它使代码更易于编写...... – 2009-03-02 03:35:40

0

不,这是C#dev团队做出的有意识的决定。人们对'with'关键字有不同的看法,因为如果滥用(嵌套),它会降低代码的可读性。

+0

我不知道你可以用“语句”来嵌套。这会降低可读性。但是,像GoTo和许多其他编程结构一样,如果使用得当,是否真的很糟糕? – Kibbee 2009-03-02 03:14:00

+1

如果使用得当,我认为它可以很好。 – 2009-03-02 03:43:39

0

我不认为它存在技术上的原因。我想说的是,它不存在的原因是它是一种编程结构,仅用于减少打字的目的。有了像智能感知,复制和粘贴之类的东西,世界对这样的功能再也没有太多需求。我使用VB.Net,无法回想它是否仍然支持。从来没有真正感到需要使用它。

13

在C#3.0中,可以使用对象初始创建对象时,达到类似的效果。

var control = new MyControl 
{ 
    Title = "title", 
    SomeEvent += handler, 
    SomeProperty = foo, 
    Another = bar 
}; 

不是:

var control = new MyControl(); 
control.Title = "title"; 
control.SomeEvent += handler; 
control.SomeProperty = foo; 
control.Another = bar; 

需要注意的是,虽然这句法年推出的C#3.0中,你仍然可以用2.0框架使用它,它的编译器引入只是语法糖。

8

不,“有”关键字被故意排除在语言之外。

如果您具有参考的冗长的名字,你可以很容易地使用变量较短提到它,甚至给它一个有限的范围内:

{ 
    SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece; 
    r.Some = 42; 
    r.Properites = "none"; 
    r.To = 1; 
    r.Set = null; 
} 
10

这不是地道的C#,但如果你真想with等同,你可以这样做:

Person MyPersonWithALongName = new Person(); 
MyUtils.With(MyPersonWithALongName, p => { 

    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 

}); 

class MyUtils { 

    public static void With<T>(T x, Action<T> do) { 
     do(x); 
    } 
} 

更新:
它发生,我认为你可以让平凡的转动我这个更简洁牛逼成一个扩展方法,或许将其改名“别名”或“作为” reabability:

MyPersonWithALongName.Alias(p => { 
    p.Name = "George"; 
    p.Address = "123 Main St"; 
    ... 
}); 
1

这些解决方案:

// .... 
// (class Common) 

public static void With<T>(T property, Action<T> action) { 
    action(property); 
} 

// ... 
// usage somewhere ...  
Person person = GetPerson(); 
Common.With(person, p => { p.Name = "test", p.Age = "123" }); 

这似乎只是我们都走样了“P”的变量。随着解决方案的发展,我发现很容易保持变量名称简短,这种带有“With”通用的解决方案不会购买任何优雅。

理想的情况下,我们都会喜欢看语法的一些改造,因此使用类似于多个属性的初始化今天如何工作的:

Person person = new Person() { Name = "test", Age = "123" };