个蠢问题, 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);
}
小知识,你可以用调试器
—— 来自 Xiaomi M2007J3SC, Android 11上的 S1Next-鹅版 v2.5.4 经典的消息框调试 写成这样你再读一下?
pathSave = _pics.Count > n
+
1 ? _pics : _pics; 当然是用了调试器...
不然我怎么知道是直接命中了那一行..
我加消息框是想准确知道当前条件到底是什么
那一行代码都变黄了
经过检查我发现不是那一行出错了.
是网上抄的一个类 某个地方下标溢出了.
那个类是个定时器
大概是在新线程中执行吧.
调试的时候没跳到那部分去...
导致我以为是变黄的那一行出错了...
多线程的调试我暂时还没学会
不断点我不知道怎么让调试进入多线程的部分. 最后发现还是我蠢了,忘了重置这个变量
string pathSave = IsPicsNotNull ? Current.Path : string.Empty;
Current也访问了数组,这时候数组是空的..所以它越界了.
但为什么不在这直接报错
按调试器显示它随机跳到了下一行(我删除了上面的命中行,然后它就跳到其他地方了)
导致我以为是被跳到的那一行越界了...
Current 是个只读属性
public static ImageHandling.ImageBase Current { get { return Pics; } }
如果VS F10在乱跳
先检查项目是debug还是release
页:
[1]