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

使用C#中的块等效?

如何解决《使用C#中的块等效?》经验,为你挑选了5个好方法。

我知道VB.Net,我正在努力搞清楚我的C#.在C#中是否有一个With块等价物?

谢谢



1> Jon Skeet..:

虽然C#与一般情况没有任何直接等价,但C#3获取构造函数调用的对象初始化语法:

var foo = new Foo { Property1 = value1, Property2 = value2, etc };

有关详细信息,请参阅深度C#的第8章 - 您可以从Manning的网站免费下载.

(免责声明 - 是的,将这本书交到更多人的手中符合我的利益.但是,嘿,这是一个免费章节,为您提供有关相关主题的更多信息......)


@JohnStock:因此“在一般情况下没有直接等价物”。但是,在仅使用`With`语句进行​​初始化的情况下,它仍然是相应的习惯用法。

2> Gulzar Nazim..:

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

很多人,包括C#语言设计师,都认为'with'常常会损害可读性,而且更多的是诅咒而不是祝福.声明具有有意义名称的局部变量并使用该变量对单个对象执行多个操作比使用具有某种隐式上下文的块更清楚.


死链接.我认为这是它的新亮点:http://blogs.msdn.com/b/peterhal/archive/2005/07/05/435760.aspx
林克斯再次死了.这是来自C#FAQ的新内容:http://blogs.msdn.com/b/csharpfaq/archive/2004/03/11/why-doesn-tc-have-vb-net-s-with-operator.aspx

3> RTPeat..:

正如上面链接的Visual C#程序管理器所说,在有些情况下,With语句更有效,这是他用作重复访问复杂表达式的简写时给出的示例.

使用扩展方法和泛型,您可以通过添加如下内容来创建与With语句模糊等效的内容:

    public static T With(this T item, Action action)
    {
        action(item);
        return item;
    }

举一个如何使用它的简单例子,使用lambda语法然后你可以用它来改变这样的东西:

    updateRoleFamily.RoleFamilyDescription = roleFamilyDescription;
    updateRoleFamily.RoleFamilyCode = roleFamilyCode;

对此:

    updateRoleFamily.With(rf =>
          {
              rf.RoleFamilyDescription = roleFamilyDescription;
              rf.RoleFamilyCode = roleFamilyCode;
          });

在这样的示例中,唯一的优势可能是更好的布局,但是使用更复杂的引用和更多属性,它可以为您提供更易读的代码.


@DanAppleyard我把它看作封装,有时可能非常有用.但后来我有偏见,来自VB.NET,经常派上用场,我真的很想念C#.任何熟悉C#的人都没有可读性问题,只是让编码更容易一些,尤其是 处理长对象名称时.
我真的没有看到你的例子显示的优势.原始代码(pre-lambda)是[objectinstance].[property] = [value].lambda代码基本上只是用rf更改updateRoleFamily.
尝试使用更长的对象实例引用和更多属性.在上面的例子中,您将updateRoleFamily简化为rf并设置两个属性,这是正确的,并不是一个很大的好处.但是,如果您的对象实例类似于myDataStructure.GetButton(44),并且您必须设置十个属性,则可以使它更易于使用lambda或设置局部变量.就像最初的VB With声明一样,它只是一点点语法糖,你可以拿走或离开.
似乎设置局部变量会更有效且更易读。`var rf = myDataStructure.GetButton(44);`我根本看不到这是语法糖。这只是设置局部变量的复杂方法。*“只是因为您不能代表您应该这样做。” *

4> Guulh..:

不,那里没有.



5> Timothy Cart..:

在" 使用对象 "部分的页面下方大约3/4 :

VB:

With hero 
  .Name = "SpamMan" 
  .PowerLevel = 3 
End With 

C#:

//No "With" construct
hero.Name = "SpamMan"; 
hero.PowerLevel = 3; 

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