使用C#中的扩展方法更改值(在VB.NET中允许)

使用C#中的扩展方法更改值(在VB.NET中允许),c#,extension-methods,C#,Extension Methods,我在试着做一些像 string s = "Hello"; s.Clear(); 我创建了如下扩展方法: public static void Clear(this string s) { s = string.Empty; } 但是,当我看到值时,它不会改变: 我不能使用ref或out,因为它们不能与关键字this一起使用。有什么想法吗?这是不可能的。 发件人: 字符串是不可变的——字符串对象的内容在对象创建后不能更改,尽管语法使其看起来好像您可以这样做。例如,当您编写此代码时,编

我在试着做一些像

string s = "Hello";
s.Clear();
我创建了如下扩展方法:

public static void Clear(this string s)
{
    s = string.Empty;
}
但是,当我看到值时,它不会改变:

我不能使用refout,因为它们不能与关键字this一起使用。有什么想法吗?

这是不可能的。 发件人:

字符串是不可变的——字符串对象的内容在对象创建后不能更改,尽管语法使其看起来好像您可以这样做。例如,当您编写此代码时,编译器实际上创建了一个新的string对象来保存新的字符序列,并且该新对象被分配给b。然后字符串“h”有资格进行垃圾收集


如果您正在寻找一种可变版本的
String
,可以尝试使用
StringBuilder

   StringBuilder s = new StringBuilder("Hello");
   s.Clear();

   ...

   String myFinalString = s.ToString(); 

如果扩展方法检查条件,则可以将操作作为参数传递(调用者传递lambda表达式),以便仅在满足条件时执行操作。这样,除非满足条件,否则可以避免对变量执行任何操作(甚至将其设置为自身)。

就是这样:
s=String.Empty。您真的需要此任务的扩展名吗?您正在获取对字符串的引用的副本,并将该副本设置为对
string.Empty
的引用。要使其工作,该方法必须采用
ref
参数,但不能是扩展方法。@ExelGamboa您想做什么?不能修改字符串。你是想清理一处房产吗?您试图解决的实际问题是什么?这是另一个问题。您希望清除某些内容(X),并认为解决方案是重新分配输入字符串(Y)的扩展方法。当这不起作用时,你问的是Y,而不是实际的问题X。你实际的问题是什么?所以我的后续问题是:为什么这样的扩展方法在VB中有效,但在C#中无效,尽管两者共享相同的CLR?CLR字节码不应该总是可以反编译到C#和VB中吗?我想反射可以找到调用对象并使其指向
string.Empty
@Alexander,即使这是可能的,我将远离这种魔力,使用
s=string.Empty
而不是对其调用扩展方法。这与可变性无关,更多的是关于扩展方法如何仅限于值传递而不是通过引用传递。OP并没有试图改变sting,而是将变量重新分配给一个不同的引用。@Alexander在某些特定的情况下,可能是这样,尽管编写这样的代码是非常邪恶的。但即使这样,您也可以编写大量代码,这样即使是反射也无法更改变量(以及大量没有变量可更改的实例)。您需要直接执行
不安全的
代码并进行任意内存修补,以处理甚至有值需要更改的所有情况。除了关于“这不可能”的开场白之外,我一点也不确定这到底是如何回答这个问题的。我想OP会问为什么在C中不允许这个引用,尽管在VB.NET中是允许的。这意味着可以编写一个扩展方法,在不查看对象时交换对象