几天前我需要切换一个bool,我最后这样做了:
IsVisible = !IsVisible;
我发现这是最简单的存档方式。 但在做上面的例子之前,我尝试了一些不同的方法。
主要是关于使用扩展方法。 在我的观点中,这将使它更简单,或至少更少的写字。
IsVisible.toggle();
但是,由于布尔值是值类型,因此通过扩展方法发送的bool是原始bool的副本,而不是引用类型。
public static void Toggle(this boolean value)
{
value = !value;
}
哪个会做我需要的,但是因为布尔切换是原始布尔的副本,更改不适用于原始..
我尝试将ref关键字infront置于“boolean”,但是没有编译。 我仍然没有找到不编译的原因,这不是扩展方法的完美功能吗?
public static void Toggle(this ref boolean value)
我甚至尝试将boolean转换为一个对象,在我的脑中将它变成一个引用类型,然后它将不再是一个副本,并且更改将被传回。 这也不起作用。
所以我的问题是,是否有可能使扩展传回更改,或者其他方式使其比现有更简单?
我知道很可能不会比顶级示例更简单或更合理,但你永远不会知道:)
提前致谢。
答案 0 :(得分:11)
原始类型是不可变的。你必须像这样编写你的调用代码:
IsVisible = IsVisible.Toggle();
使用扩展方法,这是最好的。没办法。
答案 1 :(得分:1)
作为旁白:对于像切换bool这样简单的事情,扩展方法不会是一个令人难以置信的开销吗?
答案 2 :(得分:1)
在vb.net中,可以声明扩展方法接受隐含的“this”作为ByRef
参数(相当于C#中的ref
)。这样的方法可以像人们期望的那样工作,但是对于不幸的事实,在可变存储位置之外的某些东西上调用这样的扩展方法(例如在属性值,只读存储位置等)将导致编译器静默地传递引用参数的副本,而不是发出编译错误[愚蠢的行为,假设使用ref
参数的整个点的90%的时间是能够修改它在通话现场]。不幸的是,虽然C#通常能够使用用vb编写的扩展方法,但它不允许在没有ref
关键字的情况下传递ref
参数,并且它没有提供指定{{1}的合法方式除了使用静态函数调用语法时。