我今天看了Infragistics控件库的在线帮助,看到了一些使用With关键字在选项卡控件上设置多个属性的VB代码.我做了任何VB编程已有将近10年了,我几乎忘记了这个关键字甚至存在.由于我还是比较新的C#,我很快就去看它是否有类似的构造.可悲的是,我找不到任何东西.
C#是否有一个关键字或类似的构造来模仿VB中With关键字提供的功能?如果没有,是否有技术原因导致C#没有这个?
编辑: 我在询问我的问题之前搜索了一个现有的条目,但没有找到Ray提到的那里(这里).那么,为了改进这个问题,有没有技术上的原因为什么C#没有这个?Gulzar将其钉住了 - 不,没有技术上的理由说明为什么C#没有With关键字.这是语言设计师的设计决定.
这就是C#程序经理所说的: 为什么C#没有'with'语句?
小的或不存在的可读性好处.我们认为可读性好处很小或根本不存在.我不会说with语句使代码可读性降低,但有些人可能会这样做.
语言复杂性增加.添加with语句会使语言更复杂.例如,VB必须添加新的语言语法来解决局部变量(Text)和"with"目标(.Text)上的属性之间的潜在歧义.解决此问题的其他方法也会引入语言复杂性.另一种方法是推送作用域并使属性隐藏局部变量,但是如果没有添加一些转义语法则无法引用本地.
C++遗产.C++从未有过一个with语句,并且C++开发人员通常认为缺少这样的语句不是问题.此外,我们并没有感觉到其他变化 - 人们正在编写的代码类型的变化,平台的变化,语言的其他变化等等 - 使用语句更加必要.
在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框架一起使用,它只是编译器引入的语法糖.
这不是惯用的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 x, Action do) { do(x); } }
更新:
我突然意识到,通过将其转换为扩展方法,可以简单地将其更简洁,可能将其重命名为"Alias"或"As"以实现可重用性:
MyPersonWithALongName.Alias(p => { p.Name = "George"; p.Address = "123 Main St"; ... });
不,"with"关键字被故意排除在语言之外.
如果你有一个冗长的引用名称,你可以使用变量轻松地对它进行简短的引用,甚至给它一个有限的范围:
{ SomeClass r = Some.Lengthy.Path.To.Get.To.A.Referece; r.Some = 42; r.Properites = "none"; r.To = 1; r.Set = null; }