链式调用使用体会
2011-03-14 16:18 gio.zhou 阅读(2102) 评论(13) 编辑 收藏 举报作为.NET程序员,相信JQuery的选择器与C# List的FindAll基本都有使用过,其中都一直种特殊的语法糖。
比如JQuery的:
$("#Id1").find("div").find("p").find("input[name=age]");
再比如C#中的:
List A = new List();
A.Add(new Person { Name = "Gio", Age = 26});
A.Add(new Person { Name = "Aimi", Age = 25 });
A.Add(new Person { Name = "Allen", Age = 30 });
A.Add(new Person { Name = "Jimmy", Age = 22 });
var resultObj1 = A.FindAll(p => p.Age > 23).FindAll(p => p.Name.Length < 5);
特点就是一个方法返回的类型依然有这个方法。
这里就是我所说的”链式调用”。像一个链条一般每一环的结构都相同。
这里我根据链式调用的结构写了个计算器:
计算器类:
internal class Calculator
{
private double _result;
//初始化赋值
public Calculator(double a)
{
_result = a;
}
//初始化为0
public Calculator()
{
}
//减
public Calculator Minus(double a)
{
_result -= a;
return this;
}
//加
public Calculator Plus(double a)
{
_result += a;
return this;
}
//乘
public Calculator Multiply(double a)
{
_result *= a;
return this;
}
//除
public Calculator Divide(double a)
{
_result /= a;
return this;
}
//获得结果
public double Result()
{
return _result;
}
}
//获得结果
new Calculator(1.1).Plus (4.9).Minus(2).Multiply(5).Divide(0.3).Minus(2).Result();
其中的Plus,Minus,Multiply,Divide4个方法返回的都是该类本身。都有相同的方法于属性。就如我前面所有链式调用的特点之一是每一环的结构都相同。
我们可以看一下前面所提的FindAll方法的源码:
public List<T> FindAll(Predicate<T> match)
{
if (match == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
List<T> list = new List<T>();
for (int i = 0; i < this._size; i++)
{
if (match(this._items[i]))
{
list.Add(this._items[i]);
}
}
return list;
}
改方法返回的类型依然是List<T>。
我认为链式调用的优点之一是,每个方法返回的对象不会新开辟一个新内存块进行分配。不然的话每个方法返回需要使用一个对象去保存。对于内存空间的不是太好。