C#中与Visual Basic关键字'With' ... 'End With'对应的是什么?
C#中与Visual Basic关键字'With' ... 'End With'对应的是什么?
在Visual Basic中,如果您要更改单个对象的多个属性,可以使用With/End With
语句:
Dim myObject as Object // ' Rather than writing: myObject.property1 = something myObject.property2 = something2 // ' You can write: with myObject .property1 = something .property2 = something2 ... End With
我知道在C#中创建新对象时可以这样做:
Object myObject = new Object { property1 = something, property2 = something2, ...};
但是如果myOject
已经被创建(就像Visual Basic所做的那样),我该如何做到这一点?
问题出现的原因是有人想要在C#中实现与Visual Basic关键字"With"和"End With"等效的功能,以便简化代码的书写。解决方法是使用对象别名来代替重复输入对象名称,并使用代码块的方式创建新的作用域。
以下是整理后的
在C#中,如果你想要避免大量的重复输入,你可以给对象取一个更短的名称:
var x = myObject; x.property1 = something; x.property2 = something2;
是的,如果你想要更进一步,你甚至可以使用代码块的方式来创建新的作用域:
using(var x = myObject) { x.property1 = something; }
但是,这样做是非常糟糕的主意,因为它会在代码块结束时调用Dispose方法(对于未实现IDisposable接口的类型,甚至无法通过编译)。
哦,好主意。我的错。我只是以为它会销毁变量"x",但是由于它是一个引用,这可能是致命的 😛
如果你希望在完成后变量离开作用域,你可以简单地使用花括号将代码包围起来,从而创建一个新的作用域。
避免大量的重复输入,真的吗?有了我们强大的智能感知,这完全是可读性的问题了。
通过使用对象别名和代码块的方式来创建新的作用域,你可以在C#中实现与Visual Basic关键字"With"和"End With"等效的功能。这样可以简化代码的书写,提高可读性。但是要注意,使用using语句时要确保对象实现了IDisposable接口,以便在代码块结束时正确释放资源。
问题:如何用C#实现Visual Basic关键字'With' ... 'End With'的等效功能?
原因:在C#中没有与Visual Basic中的'With' ... 'End With'关键字完全等效的功能。这可能会导致代码编写时的冗余和重复。
解决方法:可以通过创建一个扩展方法来模拟'With' ... 'End With'关键字的功能。以下是一个示例代码:
static class Extension { public static void With<T>(this T obj, Action<T> a) { a(obj); } } class Program { class Obj { public int Prop1 { get; set; } public int Prop2 { get; set; } public int Prop3 { get; set; } public int Prop4 { get; set; } } static void Main(string[] args) { var detailedName = new Obj(); detailedName.With(o => { o.Prop1 = 1; o.Prop2 = 2; o.Prop3 = 3; o.Prop4 = 4; }); } }
上述代码中定义了一个名为Extension的静态类,其中包含一个名为With的扩展方法。该方法接受一个泛型参数T和一个Action参数a,将泛型对象传递给Action并执行其中的代码。
在Main方法中,我们创建了一个名为detailedName的Obj对象,并使用With方法来设置其属性值。通过将要执行的代码放在With方法的参数中,我们可以模拟Visual Basic中的'With' ... 'End With'关键字的功能。
注意:如果使用Cadenza库,可以获得一个具有完全相同实现的方法。具体代码可以在此链接中找到。
虽然C#中没有直接等效于Visual Basic中'With' ... 'End With'关键字的功能,但可以通过创建扩展方法来模拟其功能。这样可以减少代码的冗余和重复,提高代码的可读性和可维护性。
问题的原因是'C#'语言没有与'Visual Basic'关键字'With'...'End With'等效的功能。解决方法是在'C#'中可以使用对象初始化器来实现类似的功能。
以下是解决方法的代码示例:
var obj = new MyClass { Property1 = value1, Property2 = value2, // more properties... };
在上述示例中,通过对象初始化器可以一次性设置对象的多个属性值,从而达到简化代码的目的。
请注意,以上只是一种在'C#'中实现类似功能的方法,并不是完全等效于'Visual Basic'的'With'...'End With'语法。