声明:切勿以此为笔试题。
我们很多时候都会激烈的讨论算法、数据结构、设计模式、N层架构、某某框架、系统架构,可是真的在实战当中,才会发现原来有些很简单的问题我们会不知道答案。比如说:
{
int i = 0;
do
{
Console.WriteLine(i);
i++;
if (i < 3) continue;
}
while (false);
}
上面的输出是什么呢?这个问题看起来好像很简单,continue不就是进入下一次循环嘛。可问题是,如何进入呢:是直接走到循环最上面的一行代码呢,还是走到循环条件的判断?for、foreach和while都是走到最上面一行代码,而最上面一行代码都存在或者隐含了循环条件的判断。do-while因为循环判断条件在最后,因此不可能同时符合这两个说法,那么到底哪一个说法才是真的呢?
这个问题Google之似乎是找不到答案的,反正我用关键字“do while continue”没有找到,在microsoft.com找也没有找到。MSDN对于continue的描述也只是很简单的说“continue 语句将控制权传递给它所在的封闭迭代语句的下一次迭代”,也没有do-while的continue示例。“一次迭代”这个说法包不包含“循环条件的判断”还真不是显而易见的:do-while的是先执行循环体后判断,如果认为这样算一次迭代,那么下一次迭代也应该认为是先执行循环体,然后再执行判断;如果认为每一次迭代都是先判断循环条件,后执行循环体的,那第一次显然不是这样;又或者可能认为一次迭代不包含循环条件判断,但根据微软的说法又和for、foreach和while等情况不匹配。
其实无论结果如何,MSDN上的说法肯定是不严谨的。好吧,我们忽略MSDN的问题,这个疑惑总归要解决的。结果如何,请君自己动手以便加深记忆。
0
而不是:
0
1
2
也就是说,continue的准确含义是:
立即跳过后面的语句,直达循环条件判断处。
或者说是:立即执行条件判断,如果条件判断成立,则进入下一次迭代,否则跳出循环体。
再比如:
{
dynamic t = new Host.TestPoint();
t.Test();
}
public class Host
{
private interface IFace
{
void Test();
}
public class TestPoint : IFace
{
void IFace.Test()
{
Console.WriteLine("OK");
}
}
}
我们知道dynamic是4.0的新特性,是编译器的语法糖。实际上dynamic类型对象在IL里面就是一个object,对其的访问一般来讲就是通过反射来进行调用。(当然,可以通过别的方式来自己扩展,此处忽略。)问题是,这个反射的过程会考虑上面的接口吗?假如不考虑那一定会出错。可是dynamic本身要解决的其中一个问题,是简化ActiveX调用。然而我在实际的使用过程中发现有一个.NET的COM对象上面显式的实现了一个COM接口,也就是说这不是一个Native的COM对象。此时如果不找其中的接口就会导致调用失败,大家猜结果会如何?
有的时候一些简单的问题,也还是挺有趣的。