Visual Basic 关键字的 C# 等效项:“随着”……“结束于”?
-
09-10-2019 - |
题
在 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#中执行此操作。
此功能是特定于VB的,您可以在C#中最接近的是对象初始化器,就像您描述的那样。
其他提示
这个怎么样?
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;
});
}
}
如果您想避免大量键入,则可以给对象一个较短的名称:
var x = myObject;
x.property1 = something;
x.property2 = something2;
为什么 C# 没有 VB.NET 的“with”运算符?
许多人,包括 C# 语言设计者,认为“with”常常会损害可读性,并且更多的是诅咒而不是祝福。与使用具有某种隐式上下文的块相比,使用有意义的名称声明局部变量并使用该变量对单个对象执行多个操作更清晰。
经过 @乔恩斯基特
为了向后兼容,VB.NET包括VB6的一些设计缺陷。虽然JavaScript具有相同的设计缺陷(确实是一个更糟的缺陷 with
导致更模棱两可的结构),大多数其他C-Syntax语言都不会,因此将其添加到C#中没有落后兼容的好处。
@Mark Byers回答 很好,但是变量 x
设置属性后将生活。而且你不能使用名称 x
再次(在同一块中)。
尝试这个 (对象必须是此示例中的参考类型) :
void Main()
{
var myObject1 = new Foo();
var myObject2 = new Hoo();
//elided...
{
var _ = myObject1;
_.MyPropertyA = 2;
_.MyPropertyB = "3";
}
{
var _ = myObject2;
_.MyPropertyX = 5;
_.MyPropertyY = "asd";
}
}
如果“ with”表达式是类类型,则“ with”语句等同于创建该类型的新临时变量,该变量初始化为“带有“具有“ expression”,并在每个领导”之前”。使用该变量。但是,如果它是一种结构类型,那么事情会更加复杂。考虑代码(显然不是人们通常写东西的方式,而是写下要点的写作:
With MyPoints(N) ' Array of Point N=SomeNewValue .X = MyPoints(N).X .Y = MyPoints(N).Y End With
“带有”陈述有效地锁定了对mypoints(n)的引用。即使将mypoints更改为其他一些数组,或更改了n,锁存的引用仍将指向与执行语句时相同数组的相同元素。如果一个人声明了类型点的局部变量p并抓住mypoints(n),然后写入PX和PY,则写入只会击中本地副本P,而不是更新数组。要在C#中获得类似的语义,必须使用局部变量同时保存mypoint和n,否则将with语句的内容放在具有类型点的ref参数的匿名函数中。为了避免在运行时创建关闭,匿名函数还应通过参考来接受它需要从外部范围中获得的任何局部变量。