C#扩展方法-返回调用对象

C#扩展方法-返回调用对象,c#,extension-methods,C#,Extension Methods,我不熟悉扩展方法,也不知道它们能做什么 调用对象是否可以在没有特定赋值的情况下分配输出 下面是一个简单的例子来解释: public static string ExtensionTest(this string input) { return input + " Extended!"; } 在下面的例子中 var foo = "Hello World!"; var foo2 = foo.ExtensionTest(); // foo2 = "Hello World! Extended

我不熟悉扩展方法,也不知道它们能做什么

调用对象是否可以在没有特定赋值的情况下分配输出

下面是一个简单的例子来解释:

public static string ExtensionTest(this string input)
{
    return input + " Extended!";
}
在下面的例子中

var foo = "Hello World!";

var foo2 = foo.ExtensionTest(); // foo2 = "Hello World! Extended!"

foo.ExtensionTest(); // foo = "Hello World!"

foo = foo.ExtensionTest(); // foo = "Hello World! Extended!"

。。。有没有办法让
foo.ExtensionTest()
生成
“Hello World!extensed!”
而不指定
foo=foo.ExtensionTest()

,因为字符串是不可变的


在任何情况下,如果要更改对象,都必须执行某种赋值

此参数是通过值传递的,而不是通过引用传递的。因此,不能修改调用程序中的变量,该变量在扩展方法中以“this”作为别名。

否,但不起作用的原因与字符串的不变性有关,而与扩展方法无关

如果你有一门课:

public class SomeClass
{
     public int Value {get; set;}
}
以及一种扩展方法:

public static void DoIt(this SomeClass someClass)
{
    someClass.Value++;
}
将产生以下效果:

var someClass = new SomeClass{ Value = 1 };
someClass.DoIt();

Console.WriteLine(someClass.Value); //prints "2"

不可以。NET中的字符串是不可变的。所有公共字符串方法也返回字符串的新实例

最接近这一点(这很奇怪)的方法是接受
out
参数,并将其用作返回值:

public static void ExtensionTest(this string input, out string output)
{
    output = input + " Extended!";
}
例如:

string foo = "Hello World!";
foo.ExtensionTest(out foo);
有趣的是,虽然它更像你所问的,但实际上它更容易打字


明确地说:我不建议这样做,除非进行这种方法调用对您来说非常重要。另一个开发人员看到“WTF?”时发出“WTF?”的概率必须是100%。

要在扩展方法中为变量指定新值,需要对参数进行ref修改,而C编译器不允许对扩展方法进行修改(无论如何,这是个坏主意)。最好弄清楚您正在更改变量

对可变字符串使用更快的StringBuilder,正如。StringBuilder基本上是一个改进的字符串链表。
不可变字符串是允许接近C语言和许多其他语言的行为的设计决策

string str = "foo";

str  += "bar"; // str will be free for garbage collection, 
//creating a new string object.
//Note: not entirely true in later C# versions.

StringBuilder sb = new StringBuild();
sb.Append("foo");
sb.Append("bar"); // appends object references to a linked list.
另请参见:


听起来像是在静态方法上寻找一个
这个ref
修饰符,其中调用站点看起来像
foo.Extension()。不幸的是,该语言目前没有这个功能。或许可以向语言设计师推荐一些东西?:)就我个人而言,我不想要。@Ani:哈哈,不!哦,伙计,你能想象接下来会发生的虐待吗<代码>字符串条=foo;foo.DoSomething();Console.WriteLine(ReferenceEquals(bar,foo))。。。(输出:
False
,开发者:什么?!?@dantao:没错。所有引用都属于静态方法。我实际上想在XmlNodes和XmlDocuments上这样做-这是一个简单的(我认为!)一般问题示例。我实际上想在XmlNodes和XmlDocuments上这样做-这是一个简单的(我认为!)一般问题示例。我喜欢这个!根据张贴的问题,这是一个很好的解决办法。干得好+1