在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;
最简单的语法是:
{ 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" };