在C#中等效的块?

我知道VB.Net,并试图刷新我的C#。 在C#中有一个等同的块吗?

谢谢

尽pipeC#在一般情况下没有任何直接的等价物,但C#3为构造函数调用获取对象初始值设定语法:

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

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

(免责声明 – 是的,把这本书交给更多人的手是符合我的利益的,但是,嘿,这是一个免费的章节,可以给你更多关于相关主题的信息…)

这就是Visual C#程序pipe理器必须说的: 为什么C#没有“with”语句?

包括C#语言devise师在内的许多人都认为“与”经常会损害可读性,而不是一种祝福。 用一个有意义的名字声明一个局部variables是更清楚的,并且使用该variables对单个对象执行多个操作,而不是使用某种隐式上下文的块。

正如上面链接的Visual C#程序pipe理器所说的,在With语句更加高效的情况下,这是一个有限的情况,当它被用作反复访问复杂expression式的简写时,他给出了这个例子。

使用扩展方法和generics,你可以创build一个与With语句相似的东西,通过添加如下代码:

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

以一个简单的例子来说明如何使用lambda语法,然后使用它来改变如下所示:

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

对此:

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

在这样一个例子中,唯一的好处是可能是一个更好的布局,但是更复杂的引用和更多的属性可以给你更多的可读代码。

不,那里没有。

在“ 使用对象 ”部分中向下3/4页左右:

VB:

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

C#:

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

您可以使用参数累加器模式。

关于这个的大讨论在这里:

http://blogs.msdn.com/csharpfaq/archive/2004/03/11/87817.aspx

最简单的语法是:

 { var where = new MyObject(); where.property = "xxx"; where.SomeFunction("yyy"); } { var where = new MyObject(); where.property = "zzz"; where.SomeFunction("uuu"); } 

实际上,如果您想重新使用variables名称,那么额外的代码块非常方便。

有时你可以逃避以下几点:

 var fill = cell.Style.Fill; fill.PatternType = ExcelFillStyle.Solid; fill.BackgroundColor.SetColor(Color.Gray); fill.PatternColor = Color.Black; fill.Gradient = ... 

(EPPLus @ http://zeeshanumardotnet.blogspot.com的代码示例);

我正在使用这种方式:

  worksheet.get_Range(11, 1, 11, 41) .SetHeadFontStyle() .SetHeadFillStyle(45) .SetBorders( XlBorderWeight.xlMedium , XlBorderWeight.xlThick , XlBorderWeight.xlMedium , XlBorderWeight.xlThick) ; 

SetHeadFontStyle / SetHeadFillStyle是Range的 ExtMethod,如下所示:

  public static Range SetHeadFillStyle(this Range rng, int colorIndex) { //do some operation return rng; } 

做一些操作并返回下一个操作的范围

它看起来像Linq 🙂

但现在还不能完全看起来像这样 – propery设定值

 with cell.Border(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic 

如果有多个级别的对象,可以通过“using”指令获得类似的function:

 using System; using GenderType = Hero.GenderType; //This is the shorthand using directive public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { var myHero = new Hero(); myHero.Name = "SpamMan"; myHero.PowerLevel = 3; myHero.Gender = GenderType.Male; //instead of myHero.Gender = Hero.GenderType.Male; } } public class Hero { public enum GenderType { Male, Female, Other } public string Name; public int PowerLevel; public GenderType Gender; } 

哼。 我从来没有深入使用VB.net,所以我在这里做一个假设,但我认为'使用'块可能接近你想要的。

使用为variables定义块范围,请参阅下面的示例

 using ( int temp = someFunction(param1) ) { temp++; // this works fine } temp++; // this blows up as temp is out of scope here and has been disposed 

这里有一篇来自微软的文章,它解释了更多


编辑:是的,这个答案是错的 – 原来的假设是不正确的。 VB的“WITH”更像是新的C#对象初始器:

 var yourVariable = new yourObject { param1 = 20, param2 = "some string" };