首页 新闻 会员 周边

咨询一段代码,关于构造函数

0
悬赏园豆:20 [已解决问题] 解决于 2012-09-08 20:16
   public class PartialEvaluator : ExpressionVisitor
    {
        private Func<Expression, bool> m_fnCanBeEvaluated;
        private HashSet<Expression> m_candidates;

        //构造函数
        public PartialEvaluator()
            : this(CanBeEvaluatedLocally) // 请问 this 里面的 参数 CanBeEvaluatedLocally 如何理解
        { 

        }

        public PartialEvaluator(Func<Expression, bool> fnCanBeEvaluated)
        {
            this.m_fnCanBeEvaluated = fnCanBeEvaluated;
        }

        //这个静态函数好像是this里面的参数
        private static bool CanBeEvaluatedLocally(Expression exp)
        {
            return exp.NodeType != ExpressionType.Parameter;
        }
}

请问
            PartialEvaluator evaluator = new PartialEvaluator();

这句执行是如何理解的.我主要不理解 PartialEvaluator 的函数函数 this 里面 传入的 一个静态函数的参数CanBeEvaluatedLocally,是什么意思?怎样理解执行?

如果是说将 CanBeEvaluatedLocally 方法的返回值作为构造参数,那么 CanBeEvaluatedLocally该 方法本身是需要接受一个 Expression exp参数的,该参数又是如何传进去的呢?有点不解~

谁给我讲讲这个基础,谢谢!

C#
冯岩的主页 冯岩 | 菜鸟二级 | 园豆:221
提问于:2012-09-08 10:32
< >
分享
最佳答案
1

这是C#的语法糖,可以直接将方法转成委托。例如我们很常见的button点击事件:

button.Click += new EventHandler(button_Click);  //完整写法
button.Click += button_Click;   //本质相同,省略的写法

回到你的代码:

public PartialEvaluator() : this(CanBeEvaluatedLocally)

调用了另外一个构造函数,这个构造函数接受一个Func<Expression, bool>(即输入为Expression类型,输出为bool类型)的委托,而CanBeEvaluatedLocally这个方法是符合这个委托签名的。根据上面讲的那个语法糖例子,此处等价于:

public PartialEvaluator() : this(new Func<Expression,bool>(CanBeEvaluatedLocally))
收获园豆:10
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-09-08 12:27
其他回答(1)
1
CanBeEvaluatedLocally就是Func<Expression, bool>类型的委托,this(CanBeEvaluatedLocally)调用的就是第二个构造方法。
其实这里的无参构造函数的作用只是给m_fnCanBeEvaluated委托指定一个默认值,这个值就是CanBeEvaluatedLocally。
m_fnCanBeEvaluated委托是由其它代码来调用的,如:m_fnCanBeEvaluated(new Expression()),Expression 参数是由调用的代码传进去的,但目前你这个类并没有调用的方法。
收获园豆:10
向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-08 11:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册