【发布时间】:2014-01-29 07:10:03
【问题描述】:
使用字符串类,我们可以像这样一个接一个地调用方法:
originalString.TrimStart().TrimEnd().Replace("Hello","Hi")
我想知道它是如何工作的?以及在 .net 框架中这种操作称为什么。
如果你能给我一个创建这样一个类的例子,我将不胜感激。
谢谢,
【问题讨论】:
标签: c# string function class methods
使用字符串类,我们可以像这样一个接一个地调用方法:
originalString.TrimStart().TrimEnd().Replace("Hello","Hi")
我想知道它是如何工作的?以及在 .net 框架中这种操作称为什么。
如果你能给我一个创建这样一个类的例子,我将不胜感激。
谢谢,
【问题讨论】:
标签: c# string function class methods
上述方法均返回字符串。所以这只是类型问题。
你可以像这样创建自己的类-
类定义
public class FooString
{
public FooString Test1()
{
return this;
}
public FooString Test2()
{
return this;
}
public FooString Test3(string someString)
{
return this;
}
}
方法调用
FooString test = new FooString();
test.Test1().Test2().Test3("Some string");
【讨论】:
每次操作只返回结果,如果结果是同一类型,则可以调用结果的方法,然后调用结果的方法等。
public class A
{
public A SomeMethod();
...
}
A.SomeMethod().SomeMethod()...
【讨论】:
这个方法中的每一个都返回新的字符串,所以基本上这是在返回字符串的字符串上调用的方法。您可以创建自己的类,创建方法并像这样运行它。
非常重要的是要注意字符串是不可变的,因此调用例如字符串上的Trim 不会改变它。
public string Trim()
{
return this.TrimHelper(2);
}
这就是Trim 的样子,没有魔法只是简单的方法。
如果你的类不是不可变的,最好的方法是为你的类创建扩展方法。你可以阅读更多关于扩展方法here。
普通方法示例
public class Test
{
public int Prop {get;set;}
public Test DoStuf()
{
Prop=1;
return this;
}
public Test DoOtherStuff()
{
return new Test();
}
}
并使用它:
var test = new Test();
test.DoStuff().DoOtherStuff();
【讨论】:
您所看到的背后的主体称为Method Chaining(或也称为流利界面)。
之所以有效,是因为该方法返回与其包含类型相同的类型(即,TrimStart 是 String 类上的一个函数,并且还返回一个 String)。然而,这不仅限于字符串。
我能想到的最好的现代示例之一是 jQuery(在维基百科文章中提到)。
【讨论】:
这没什么特别的。 string 类的很多方法都返回一个字符串,所以你可以在返回值上调用其他方法。
例如TrimStart() 返回一个新字符串,其中的空格在开始时已被去除。然后在返回的字符串上调用TrimEnd()。
有时这称为Fluent interface 或method chaining。
【讨论】:
这很简单。 String 是一个不可变的类。这意味着您对其执行的每一个转换其值的操作都需要返回一个新的不同的 String 实例(因为当前的实例无法更改)。您可以在其上调用另一个操作等等...
string newString = originalString.Replace("Hello","Hi") // new instance
int length = newString.Length // a simple property.
【讨论】: