新足迹

 找回密码
 注册

精华好帖回顾

· 色彩缤纷的家常菜 NO.11------港式烧肉配蜜瓜 (2008-8-27) komen · 找了四十天工作,找到2份,下周上班了 (2006-4-27) 不会游泳的鱼
· city的日与夜 黑与白 (2012-7-12) JerryWu · 江山如此多娇 - 老陶推荐一个好去处 (新加了点自己的感触) (2008-9-19) 老陶
Advertisement
Advertisement
查看: 1332|回复: 25

[IT] 请教C# 高手之二: continue 和 switch case 的应用 [复制链接]

发表于 2010-6-3 16:20 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在Delphi中, continue 可以放在 case 中, 如下:

procedure CalculateNumber;
var
  i, Value, Total : integer;
begin
  Total := 0;
  Value := 0;
  for i := 1 to 5 do
  begin
    case i of
    2,4: continue;
    1,5: Value := i+1;
    else
      Value := i*2;
    end;
    Total := Total + Value;
  end;
  ShowMessage(IntToStr(Total));
end;

但是C#好像不可以, 因为case 中的每一段必须有break, switch 就好像是特殊的loop.
遇到这种情况是不是要用bool 变量, 然后根据bool变量来做计算?
if (!NeedSkip)
{
  Total = Total + Value;
}
持不同股见者...
Advertisement
Advertisement

发表于 2010-6-3 16:28 |显示全部楼层
此文章由 蓝爸爸 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 蓝爸爸 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不用bool变量,只需在需要skip的那个分支里面,把value置成0不就得了。

发表于 2010-6-3 17:21 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 蓝爸爸 于 2010-6-3 15:28 发表
不用bool变量,只需在需要skip的那个分支里面,把value置成0不就得了。

这个例子举得不好, 事实上是一个read data records 的while loop, 如果在case里发现不成立, 这条record我们就要跳过,继续下一条record.


procedure DoLoop;
var
  ServType : TServType;
  with Query1 do
  begin
    Open;
    while not EOF do
    begin
      ServType := TServType(FieldByName('ServType').AsInteger);
      case ServType of
      svLocal: if not DoSomeThing1 then
                 Continue;
      svRoad : if not DoSomeThing2 then
                 Continue;
      svSatchel : if not DoSomeThing3 then
                    Continue;
      end;

      MyObject := MyObjectList.Add(TMyObject);
      MyObject.Item1 := FieldByName('item1').AsString;
      MyObject.Item2 := FieldByName('item2').AsString;
    end;
    Close;
  end;

这里TServType 是enumerator;
持不同股见者...

发表于 2010-6-3 17:51 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
What do you want to achieve?

发表于 2010-6-3 18:04 |显示全部楼层
此文章由 bainite 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bainite 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果在一个loop里,c#的switch里也可以continue啊,continue后面不用break,因为已经调到外面的loop的下一个了。
还有switch-case不是loop,是类似于if...else if 的条件判断。break是为了让它不执行接下来的case。

发表于 2010-6-3 18:09 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你想实现什么?
Advertisement
Advertisement

发表于 2010-6-3 18:17 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
int total = 0, value = 0;

            for (int i = 1; i <= 5; i++)
            {
                switch (i)
                {
                    case 2:
                        continue;
                    case 4:
                        continue;
                    case 1:
                        value = i + 1;
                        break;
                    case 5:
                        value = i + 1;
                        break;
                    default:
                        value = i * 2;
                        break;
                }
                total += value;
            }

当i=2或4的时候,直接跳到下一个for循环。total+=value不执行。

[ 本帖最后由 jerryclark 于 2010-6-3 17:19 编辑 ]

评分

参与人数 1积分 +3 收起 理由
hornsay + 3 谢谢奉献

查看全部评分

发表于 2010-6-3 18:21 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
LZ在Visual Studio里面,设置一个break point,然后debug的时候一步一步Step Over,你就可以看到到底是跳转到哪一行上面

发表于 2010-6-3 18:27 |显示全部楼层

回复 7# 的帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
就是要这个,我以为case 里只能有break;

发表于 2010-6-3 18:36 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Delphi里不用break, 而书里面只是强调了每个case要有break, 所以以为只能用break;

发表于 2010-6-3 22:47 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
C#里面switch必须用break,否则编译错误。
因为C#不允许从一个case 跳转到另外一个case


            switch (i)
            {

                case 1:
                    DoA();
                case 2:
                    DoB();
                    break;
                default:
                    break;

            }

当i=1的时候想执行DoA() 和 DoB()
这个会有编译错误的:Control cannot fall through from one case label ('case 1:') to another         

应该写成:
switch (i)
            {

                case 1:
                    DoA();
                    DoB();
                case 2:
                    DoB();
                    break;
                default:
                    break;

            }

[ 本帖最后由 jerryclark 于 2010-6-4 10:12 编辑 ]
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-6-3 23:17 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jerryclark 于 2010-6-3 21:47 发表
C#里面switch必须用break,否则编译错误。
因为C#不允许从一个case 跳转到另外一个case

case 1:
case 2:
DoSomethingForCaseOwnAndTwo();
break;

以上语句编译会出错的。
必须写成
case 1:
DoSomething ...


you kidding right?

发表于 2010-6-3 23:25 |显示全部楼层
此文章由 xxmplus 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 xxmplus 所有!转贴必须注明作者、出处和本声明,并保持内容完整
脑科专家看来没碰过c系列的语言

2010年度奖章获得者

发表于 2010-6-3 23:31 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 xxmplus 于 2010-6-3 22:25 发表
脑科专家看来没碰过c系列的语言


是啊, 这种问题,自己上个鸡不就得了吗。

我没碰过delphi,影响中和vb是一个套路吧?

发表于 2010-6-3 23:34 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 xxmplus 于 2010-6-3 22:25 发表
脑科专家看来没碰过c系列的语言


做了13年的Delphi, 现在刚开始接触C#, 等于是从头开始学这种语言,最主要还是Syntax现在一点都不熟。苦啊. 而且我现在一边要用Delphi对现有的产品维护及添加新功能,剩余的时间才能碰C#,所以进展会慢许多.
持不同股见者...

发表于 2010-6-3 23:38 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-6-3 22:31 发表


是啊, 这种问题,自己上个鸡不就得了吗。

我没碰过delphi,影响中和vb是一个套路吧?


VB没法和Delphi比,即便是C#, 就Desktop application 而言,我还是喜欢Delphi。
持不同股见者...
Advertisement
Advertisement

发表于 2010-6-3 23:42 |显示全部楼层

回复 15# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
建议你找一本C#的语法书,要比较经典的那种。switch-case是最简单的东西了,在这上面别花很多时间。有很多其他东西。比如value type vs reference type, boxing/unboxing, template, delegate, polymo人phism这些东西比switch-case要复杂的多。

可以考虑花点业余时间掌握C#, 否则进度会很慢。

发表于 2010-6-3 23:52 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2010-6-3 22:42 发表
建议你找一本C#的语法书,要比较经典的那种。switch-case是最简单的东西了,在这上面别花很多时间。有很多其他东西。比如value type vs reference type, boxing/unboxing, template, delegate, polymo人phism这些东西 ...


其实真的深的东西反而更容易些,因为object oriented的概念都一样, 包括design pattern里的东西. 难就难在刚开始的基本的syntax。
持不同股见者...

发表于 2010-6-4 00:08 |显示全部楼层

回复 18# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这些条件语法看看书,msdn也可以,再上机操作下,不都有了,有啥难的。

2010年度奖章获得者

发表于 2010-6-4 00:17 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我瞄了以眼delphi语法, 还行更c#不算差的太远,基本上能读下来。

语法上有点像介于vb.net c# 之间。 你搞本c#的书先通读一遍,别急着上鸡。

我那会看objective c 时那真是叫一个难受哦。用它那个IDE是,我好几次想把苹果砸了

发表于 2010-6-4 00:32 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我现在的ASP.NET小项目,基本完成了70%,许多概念和Delphi不同,像Dataset, Delphi中也有Dataset, 但完全是俩个不同的概念,所以会有不少confuse.

Delphi用的是Pascal语言,学IT时第一年上半年的编程课,下半年学的是C。所以感觉学C#要比学VB更容易些。
持不同股见者...
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-6-4 00:46 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2010-6-3 23:32 发表
我现在的ASP.NET小项目,基本完成了70%,许多概念和Delphi不同,像Dataset, Delphi中也有Dataset, 但完全是俩个不同的概念,所以会有不少confuse.

Delphi用的是Pascal语言,学IT时第一年上半年的编程课,下半年学 ...


你有基础,语法熟了后会进步很快的。 说道dataset, 你跳过不学问题也不大。

我已经基本上完全不用ado。net 好久了。 IEnumberable<T> is your friend.

2010年度奖章获得者

发表于 2010-6-4 01:03 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
既然你正在看switch, foreach, if

给你个小tip, 顺便看一下yield 很强大的一个,但知道的人出奇的少,用的人更少。

public IEnumerable<int> Get()
{
      for (int i = 0; i < 5; i++)
           yield return i;
}

评分

参与人数 1积分 +3 收起 理由
hornsay + 3 感谢分享

查看全部评分

发表于 2010-6-4 11:11 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-6-3 22:17 发表


you kidding right?

哦。写错了。举错例子了。
应该是

            switch (i)
            {

                case 1:
                    DoA();
                case 2:
                    DoB();
                    break;
                default:
                    break;

            }

当i=1的时候想执行DoA() 和 DoB()
这个会有编译错误的:Control cannot fall through from one case label ('case 1:') to another         

应该写成:
switch (i)
            {

                case 1:
                    DoA();
                    DoB();
                case 2:
                    DoB();
                    break;
                default:
                    break;

            }

发表于 2010-6-4 11:16 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-6-4 00:03 发表
既然你正在看switch, foreach, if

给你个小tip, 顺便看一下yield 很强大的一个,但知道的人出奇的少,用的人更少。

public IEnumerable Get()
{
      for (int i = 0; i < 5; i++)
           yield re ...

我知道,考MCSD的时候见过

发表于 2010-6-4 11:53 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
新足迹真是人才济济。过几天再发一贴求助,我想难度会提高一些。
Advertisement
Advertisement

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部