我是扩展方法的新手,并探索他们可以做些什么。
是否可以在没有特定分配的情况下为调用对象分配输出?
这是一个简单的例子来解释:
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()
答案 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.
另见: