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

时间:2011-01-26 14:24:52

标签: 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!"

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

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

...如果没有明确指定foo.ExtensionTest()

,有没有办法让"Hello World! Extended!"导致foo = foo.ExtensionTest()

7 个答案:

答案 0 :(得分:13)

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

如果你有一个班级:

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"

答案 1 :(得分:5)

您所看到的是由于字符串不可变。

在任何情况下,如果您希望更改对象,您将 进行某种分配。

答案 2 :(得分:5)

你最接近这个(这可能很奇怪)就是接受out参数并将其用作返回值:

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

示例:

string foo = "Hello World!";
foo.ExtensionTest(out foo);

有趣的是,虽然它更接近类似你所询问的内容,实际上输入的内容会更多。

要明确:我推荐这个,除非你真的对你做这种方法调用非常重要。另一位开发人员说出“WTF”的可能性?看到它必须像100%一样。

答案 3 :(得分:4)

'this'参数按值传递,而不是通过引用传递。所以不,你不能在你的扩展方法中修改调用程序中由'this'别名的变量。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

要在扩展方法内为变量赋值,你需要在参数上使用ref修饰符,C#编译器不允许在扩展方法上使用(无论如何这都是个坏主意)。最好明确表示你正在改变变量。

答案 6 :(得分:0)

将更快的StringBuilder用于可变字符串,并指出ref or out keyword。 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.

另见: