从扩展方法修改ValueType?

时间:2009-08-26 19:47:42

标签: c# extension-methods

几天前我需要切换一个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转换为一个对象,在我的脑中将它变成一个引用类型,然后它将不再是一个副本,并且更改将被传回。 这也不起作用。

所以我的问题是,是否有可能使扩展传回更改,或者其他方式使其比现有更简单?

我知道很可能不会比顶级示例更简单或更合理,但你永远不会知道:)

提前致谢。

3 个答案:

答案 0 :(得分:11)

原始类型是不可变的。你必须像这样编写你的调用代码:

IsVisible = IsVisible.Toggle();

使用扩展方法,这是最好的。没办法。

答案 1 :(得分:1)

作为旁白:对于像切换bool这样简单的事情,扩展方法不会是一个令人难以置信的开销吗?

答案 2 :(得分:1)

在vb.net中,可以声明扩展方法接受隐含的“this”作为ByRef参数(相当于C#中的ref)。这样的方法可以像人们期望的那样工作,但是对于不幸的事实,在可变存储位置之外的某些东西上调用这样的扩展方法(例如在属性值,只读存储位置等)将导致编译器静默地传递引用参数的副本,而不是发出编译错误[愚蠢的行为,假设使用ref参数的整个的90%的时间是能够修改它在通话现场]。不幸的是,虽然C#通常能够使用用vb编写的扩展方法,但它不允许在没有ref关键字的情况下传递ref参数,并且它没有提供指定{{1}的合法方式除了使用静态函数调用语法时。