代码改变世界

链式调用使用体会

2011-03-14 16:18  gio.zhou  阅读(2097)  评论(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>。

      我认为链式调用的优点之一是,每个方法返回的对象不会新开辟一个新内存块进行分配。不然的话每个方法返回需要使用一个对象去保存。对于内存空间的不是太好。