找回密码
 立即注册
搜索
查看: 1398|回复: 7

[软件] 个蠢问题, C#中 if/else 不按逻辑执行可能是哪出了问题?

[复制链接]
发表于 2022-8-15 12:32 | 显示全部楼层 |阅读模式
本帖最后由 夜语 于 2022-8-15 12:34 编辑

很简单的逻辑,检查文件是否存在,再细分几种情况
怀疑是我写错了我在好多地方明确的用消息框判断 bool 是否正确
但 消息框提示的 bool  是 true 却进到 false 分支
最奇怪的直接就跳到了某一行,同一语句块的上一行居然不执行...

举例文件是新增的,应该进入第一个true分支
但它直接跳到了  ////被直接命中  且跳过了上一语句  //////被跳过了没执行
这一句之前我清空了一个 数组
然后这一句就直接报 下标溢出错误了

这一行代码是200ms执行一次
有没有可能执行的时候条件是一种情况(逻辑是旧的)
我用消息框提示的是另一种情况(消息框是时的,后续的逻辑是旧的)

抱歉,放代码框中好像乱码... 我尽量精简了多余部分,直接放文本吧


            string path = Path.Combine(CurrentDir, e.Name);
            int n = GetIndexFromPath(path);
            string pathSave = Current.Path;

            MessageBox.Show($"{File.Exists(path)}");
            if (File.Exists(path))
            {
                MessageBox.Show($"{File.Exists(path)}");
                if (n < 0) //新增
                {
                    n = GetInsertIndex(path);
                    _pics.Insert(n, path);
                    Pics.Insert(n, new ImageHandling.ImageBase(path));
                }
                else //修改
                {
                    Pics.RemoveAt(n);
                    Pics.Insert(n, new ImageHandling.ImageBase(path));
                }
            }
            else   //删除;
            {
                MessageBox.Show($"{File.Exists(path)}"); //////被跳过了没执行

                if (_pics.Count == 1)
                {
                    Misc.States.DirChange();
                    MainWindow.Restore();
                    return;
                }
                if (pathSave == path && IsPicsNotNull) //删除当前文件
                {
                    MessageBox.Show($"{File.Exists(path)}");  //////被跳过了没执行

                    pathSave = _pics.Count > n + 1 ? _pics[n + 1] : _pics[n - 1];   ///被直接命中
                }

                if (n < 0) return;
                _pics.RemoveAt(n);
                Pics.RemoveAt(n);
            }


回复

使用道具 举报

     
发表于 2022-8-15 12:40 来自手机 | 显示全部楼层
小知识,你可以用调试器

—— 来自 Xiaomi M2007J3SC, Android 11上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2022-8-15 12:46 | 显示全部楼层
经典的消息框调试
回复

使用道具 举报

     
发表于 2022-8-15 12:47 | 显示全部楼层
写成这样你再读一下?
pathSave = _pics.Count > n
+
1 ? _pics[n + 1] : _pics[n - 1];
回复

使用道具 举报

头像被屏蔽
     
发表于 2022-8-15 12:50 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2022-8-15 12:52 | 显示全部楼层
当然是用了调试器...
不然我怎么知道是直接命中了那一行..
我加消息框是想准确知道当前条件到底是什么
那一行代码都变黄了

经过检查我发现不是那一行出错了.
是网上抄的一个类 某个地方下标溢出了.
那个类是个定时器
大概是在新线程中执行吧.
调试的时候没跳到那部分去...

导致我以为是变黄的那一行出错了...
多线程的调试我暂时还没学会
不断点我不知道怎么让调试进入多线程的部分.
回复

使用道具 举报

 楼主| 发表于 2022-8-15 13:35 | 显示全部楼层
最后发现还是我蠢了,忘了重置这个变量
string pathSave = IsPicsNotNull ? Current.Path : string.Empty;

Current也访问了数组,这时候数组是空的..所以它越界了.

但为什么不在这直接报错
按调试器显示它随机跳到了下一行(我删除了上面的命中行,然后它就跳到其他地方了)
导致我以为是被跳到的那一行越界了...

Current 是个只读属性
public static ImageHandling.ImageBase Current { get { return Pics[FolderIndex]; } }

回复

使用道具 举报

     
发表于 2022-8-15 15:31 | 显示全部楼层
如果VS F10在乱跳
先检查项目是debug还是release
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-22 12:36 , Processed in 0.053413 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表