夜语 发表于 2022-8-15 12:32

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

本帖最后由 夜语 于 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 : _pics;   ///被直接命中
                }

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


少打音游多读书 发表于 2022-8-15 12:40

小知识,你可以用调试器

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

atomicink 发表于 2022-8-15 12:46

经典的消息框调试

lotsbiss 发表于 2022-8-15 12:47

写成这样你再读一下?
pathSave = _pics.Count > n
+
1 ? _pics : _pics;

默读者 发表于 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; } }

woodcoin 发表于 2022-8-15 15:31

如果VS F10在乱跳
先检查项目是debug还是release
页: [1]
查看完整版本: 个蠢问题, C#中 if/else 不按逻辑执行可能是哪出了问题?