缺少C#中的’with’关键字
我今天正在查看Infragistics控件库的在线帮助,并看到一些VB代码使用With关键字在选项卡控件上设置多个属性。 自从我完成任何VB编程已经将近10年了,我几乎忘记了这个关键字甚至存在。 由于我还是比较新的C#,我很快就去看它是否有类似的结构。 可悲的是,我找不到任何东西。
C#是否有一个关键字或类似的构造来模仿VB中With关键字提供的function? 如果没有,是否有技术原因导致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#,但如果你真的想要一个等价的,你可以这样做:
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; }
对于这些解决方案
// .... // (class Common) public static void With(T property, Action action) { action(property); } // ... // usage somewhere ... Person person = GetPerson(); Common.With(person, p => { p.Name = "test", p.Age = "123" });
我们似乎正在用“p”对变量进行别名。 随着解决方案的发展,我发现很容易保持变量名称简短,这种带有“With”generics的解决方案并不会带来任何优雅。
理想情况下,我们都希望看到一些语法的重写,因此其用法类似于今天多个属性的初始化如何工作:
Person person = new Person() { Name = "test", Age = "123" };
不,这是C#开发团队做出的有意识的决定。 人们对’with’关键字有着复杂的感觉,因为如果滥用(嵌套用),它会降低代码的可读性。
我不认为它存在技术原因。 我要说的是,它不存在的原因是它是一种编程结构,仅仅是为了减少打字。 通过智能感知,复制和粘贴之类的东西,世界对这样的function不再有太多需求了。 我使用VB.Net,并且无法回忆它是否仍然受支持。 从来没有真正感到需要使用它。