在C#中缺少'with'关键字。

10 浏览
0 Comments

在C#中缺少'with'关键字。

今天我在查看Infragistics控件库的在线帮助时,看到了一些使用With关键字在选项卡控件上设置多个属性的VB代码。我已经有将近10年没有使用VB编程了,我几乎忘记了这个关键字的存在。由于我对C#还比较新,所以我迅速去查看它是否有类似的结构。可惜的是,我没有找到任何相关信息。

C#是否有一个关键字或类似的结构来模仿VB中With关键字提供的功能?如果没有,C#为什么没有这个功能?

编辑:在提问之前,我搜索了现有的条目,但没有找到Ray提到的那个(这里)。为了更明确问题,那么C#为什么没有这个功能呢?Gulzar解决了这个问题-不,C#没有一个With关键字是有技术原因的。这是语言设计者的一个设计决策。

0
0 Comments

在C#中,没有内置的with关键字,但是如果你真的想要一个类似的功能,可以按照以下方法实现:

首先,在代码中创建一个名为MyUtils的类,其中包含一个名为With的静态方法。这个方法接受一个对象x和一个Action<T>委托作为参数。在方法内部,将传入的对象x作为参数传递给do委托。

接下来,在你想要使用with功能的地方,创建一个新的对象,并将其赋值给一个变量。例如,Person MyPersonWithALongName = new Person();

然后,调用MyUtils.With方法,并将新创建的对象和一个匿名方法作为参数传递进去。在匿名方法中,可以按照需要设置对象的属性。例如,p.Name = "George"; p.Address = "123 Main St";

最后,匿名方法执行完毕后,对象x的属性将会被修改。

如果你想让代码更加简洁,你可以将With方法转换为一个扩展方法,并将其命名为Alias或者As,以增加可读性。这样,你就可以直接在对象上调用Alias方法,并传递一个匿名方法作为参数,来设置对象的属性。

需要注意的是,为了避免意外修改结构体的副本,你应该将类型T限制为引用类型,可以使用where T : class来实现这个限制。

0
0 Comments

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

没错,但是只有在创建对象时才能使用这种机制。如果对象已经存在,则没有机制可以使用。谢谢你提醒我。

是的,谢谢。我在我的帖子中进一步澄清了这一点。

问题原因:在使用对象初始化器时,代码中缺少了'with'关键字。

解决方法:在代码中加入'with'关键字即可解决这个问题。

整理后的文章如下:

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

然而,需要注意的是,使用对象初始化器只能在创建对象时使用,如果对象已经存在,则没有相应的机制可以使用。希望这一点能为大家提供一些帮助。

以上就是关于(Missing the 'with' keyword in C#)这个问题的原因以及解决方法的整理。希望对大家有所帮助。

0
0 Comments

在C#中缺少'with'关键字的原因是多方面的,以下是C#程序经理的解释:

1. 可读性的好处有限。我们认为使用with语句的可读性好处很小,甚至可以说没有。我不会说with语句使代码变得不可读,但有些人可能会这么认为。

2. 增加了语言的复杂性。添加with语句会使语言更加复杂。例如,VB必须添加新的语法来解决本地变量(Text)和“with”目标上的属性(.Text)之间的潜在歧义。其他解决这个问题的方法也会引入语言的复杂性。另一种方法是推动作用域并使属性隐藏本地变量,但这样就没有办法引用本地变量,除非添加一些转义语法。

3. C++的遗产。C++从来没有with语句,而且缺乏这样的语句通常不被认为是一个问题。此外,我们认为其他改变(人们编写的代码类型的改变、平台的改变、语言的其他改变等)并没有使with语句变得更加必要。

尽管如此,有些人对这些解释持不同意见。他们认为with关键字与代码的可读性关系不大,而更多地是为了使代码更容易编写。并且他们认为与LINQ、匿名方法等相比,with关键字的复杂性并不高。不过,这只是个别意见。总体而言,C#团队认为不添加with关键字更加合适。

这些是C#程序经理的解释。任何VB.NET开发人员都知道with关键字对于改善代码质量的重要性:无需临时变量、快速转换,与C#相比,可以用更少的代码实现相同的目标。

0