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

She*_*vek 6 c# extension-methods

我是Extension Methods的新手,并探索他们可以做些什么.

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

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

public static string ExtensionTest(this string input)
{
    return input + " Extended!";
}
Run Code Online (Sandbox Code Playgroud)

在以下示例中......

var foo = "Hello World!";

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

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

foo = foo.ExtensionTest(); // foo = "Hello World! Extended!"
Run Code Online (Sandbox Code Playgroud)

...有没有任何方法可以foo.ExtensionTest()"Hello World! Extended!"没有特别指定的情况下获得结果foo = foo.ExtensionTest()

Kla*_*sen 13

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

如果你有一个班级:

public class SomeClass
{
     public int Value {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

并且扩展方法:

public static void DoIt(this SomeClass someClass)
{
    someClass.Value++;
}
Run Code Online (Sandbox Code Playgroud)

会产生以下影响:

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

Console.WriteLine(someClass.Value); //prints "2"
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 5

你看到的是由于字符串是不可变的.

在任何情况下,如果您希望更改对象,则必须执行某种分配.


Dan*_*Tao 5

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

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

例:

string foo = "Hello World!";
foo.ExtensionTest(out foo);
Run Code Online (Sandbox Code Playgroud)

关于有趣的是,虽然它更紧密地类似于你问什么,它实际上稍微打字.

要明确:我建议这样,除非你对这种方法调用非常重要.另一位开发人员说出"WTF"的可能性?看到它必须是100%的东西.