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