否则声明永远不会到达

Posted

技术标签:

【中文标题】否则声明永远不会到达【英文标题】:Else statement never reach 【发布时间】:2021-11-02 23:57:28 【问题描述】:

我有一个 if 语句与 Linq 中的查询对齐以在我的应用程序中创建登录名,但是,代码工作不好,当查询不选择任何记录时,.Count() 它等于零并且它有道理,但是在 if 中,代码永远不会到达 else 部分,看,这是我的代码:

var UserLogin = from m in _context.User where m.Username.Contains(this.Username) & m.Password.Contains(this.Password) select m.Username;
                this.Username = string.Empty;
                this.Password = string.Empty;
                if(UserLogin.Count() != 0)
                
                    //HttpContext.Session.SetString("Username", UserLogin.First());
                    UsernameLogged = UserLogin.First();
                
                else
                
                    Console.WriteLine("Sisa: " + UsernameLogged);
                    this.Username = string.Empty;
                    this.Password = string.Empty;
                    UsernameLogged = string.Empty;
                    Console.WriteLine(UsernameLogged);
                

【问题讨论】:

不完全确定您要做什么。你得到一个错误还是什么?永远无法到达 else 部分的唯一其他原因是 if 块正在执行。在运行时检查 UserLogin.Count() 的值,你可能会得到一个线索 您是否手动将代码与您的 Linq 查询对齐?不要那样做,这很混乱。 顺便说一句,您对用户名和密码的比较存在严重的安全漏洞。 m.Password.Contains(this.Password) - 请不要将密码保存为纯文本。 散列它们。 【参考方案1】:

请注意,查询会执行两次。第一次拨打UserLogin.Count()时。第二次拨打UserLogin.First()时。但是,您已经将UsernamePassword 设置为string.Empty,并且所有用户名和密码都包含一个空字符串,因为String.Contains 仅测试字符串的一部分是否匹配。所以你得到了结果中的所有用户。使用== 测试整个字符串。

由于您只想获取一个用户,请使用FirstOrDefault,当找不到用户时返回null

var userLogged = _context.User
    .FirstOrDefault(u => u.Username == Username && u.Password == Password);
if (userLogged is null) 
    Console.WriteLine("Sisa: " + UsernameLogged);
    Username = string.Empty;
    Password = string.Empty;
    UsernameLogged = string.Empty;
    Console.WriteLine(UsernameLogged);
 else 
    UsernameLogged = userLogged.Username;

您将UsernamePassword 设置为string.Empty 两次。如果您总是想这样做,请在 if-else 之后清除它们,或者仅在找不到用户时才这样做。

【讨论】:

【参考方案2】:

这是因为您正在使用延迟执行 LINQ 查询。您的查询在 if 条件下执行,您将获得 count 1。

使用下面的代码 -

var UserLogin = from m in _context.User where m.Username.Contains(this.Username) & m.Password.Contains(this.Password) select m.Username;

var count = UserLogin.Count(); // Here your query will be execute

this.Username = string.Empty;
this.Password = string.Empty;

if(count != 0)

     //HttpContext.Session.SetString("Username", UserLogin.First());
     UsernameLogged = UserLogin.First();

else

     Console.WriteLine("Sisa: " + UsernameLogged);
     this.Username = string.Empty;
     this.Password = string.Empty;
     UsernameLogged = string.Empty;
     Console.WriteLine(UsernameLogged);

这将执行你的 else 条件。

【讨论】:

以上是关于否则声明永远不会到达的主要内容,如果未能解决你的问题,请参考以下文章

对 creatorUserRecordID 的 CKSubscription 永远不会到达

发送到 UI 线程的消息永远不会到达

FusedLocationClient.getLastLocation(),永远不会到达 onSuccess

无限期地等待可能永远不会到达的消息

异常永远不会到达异步方法中的处理程序(C#)[重复]

UI 测试 + postNotificationName + 永远不会到达观察者 + Xcode 7