当前位置:  开发笔记 > 编程语言 > 正文

缺少C#中的'with'关键字

如何解决《缺少C#中的'with'关键字》经验,为你挑选了4个好方法。

我今天看了Infragistics控件库的在线帮助,看到了一些使用With关键字在选项卡控件上设置多个属性的VB代码.我做了任何VB编程已有将近10年了,我几乎忘记了这个关键字甚至存在.由于我还是比较新的C#,我很快就去看它是否有类似的构造.可悲的是,我找不到任何东西.

C#是否有一个关键字或类似的构造来模仿VB中With关键字提供的功能?如果没有,是否有技术原因导致C#没有这个?

编辑: 我在询问我的问题之前搜索了一个现有的条目,但没有找到Ray提到的那里(这里).那么,为了改进这个问题,有没有技术上的原因为什么C#没有这个?Gulzar将其钉住了 - 不,没有技术上的理由说明为什么C#没有With关键字.这是语言设计师的设计决定.



1> Gulzar Nazim..:

这就是C#程序经理所说的: 为什么C#没有'with'语句?

小的或不存在的可读性好处.我们认为可读性好处很小或根本不存在.我不会说with语句使代码可读性降低,但有些人可能会这样做.

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

C++遗产.C++从未有过一个with语句,并且C++开发人员通常认为缺少这样的语句不是问题.此外,我们并没有感觉到其他变化 - 人们正在编写的代码类型的变化,平台的变化,语言的其他变化等等 - 使用语句更加必要.


...我发现很难相信带有关键字的关键字与LINQ,匿名方法等所涉及的复杂性有关,但我离题了.再次感谢您的链接.

2> Matthew Olen..:

在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框架一起使用,它只是编译器引入的语法糖.



3> Gabe Moothar..:

这不是惯用的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";
    ...
});


你想确保将T限制为引用类型("T:class"),这样你就不会意外地编辑struct x的副本

4> Guffa..:

不,"with"关键字被故意排除在语言之外.

如果你有一个冗长的引用名称,你可以使用变量轻松地对它进行简短的引用,甚至给它一个有限的范围:

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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有