在 if 语句 c# 中分配变量
Posted
技术标签:
【中文标题】在 if 语句 c# 中分配变量【英文标题】:assigning variables in if statements c# 【发布时间】:2018-07-31 08:41:51 【问题描述】:我的问题是:我正在为 c# 编写一个涉及用户身份验证的控制台应用程序。我已经声明了一个 User 类并将所有现有用户放在一个列表中。我有这个块来查看用户的输入是否与登录序列中的现有用户名匹配。
User CurrentUser;
for (int i = 0; i < users.Count; i++)
if (UsernameLogonInput == users[i].Name)
nameExists = true;
CurrentUser = users[i];
这一切都很好,但后来,我有这个块,用于登录。
if (nameExists)
bool isValid = false;
do
Console.Write("Enter Password : ");
string input = Console.ReadLine();
if (input == CurrentUser.Password)
isValid = true;
else
Console.WriteLine("INVALID. EC102");
while (!isValid);
我遇到的问题是,Visual Studio 在第二个块中对 CurrentUser.Password
说“使用未分配的局部变量”。我很确定这是因为 CurrentUser 是在 if 语句中分配的,我想知道是否有任何方法可以解决块范围的问题。
【问题讨论】:
赋值CurrentUser
等于null
,然后在检查Password
属性之前检查它是否为空。
我不知道这是否是学校的作业,但这是一种糟糕的用户身份验证方式。如果这是针对个人项目或您的工作,我强烈建议您考虑替代解决方案(或者更好的是,使用现有的身份验证框架)
@maccettura 是正确的;这真的很糟糕。它的坏处之一是:在密码检查之前永远不要进行用户身份检查。同时获取用户标识和密码,然后检查它们是否是有效的一对,然后不管用户名或密码是否错误都给出same错误。这样一来,攻击者就无法通过尝试使用虚拟密码来确定给定名称是否是有效帐户。
谢天谢地,我这样做并不是为了尽可能安全。我这样做是为了感受一下这种语言,但我现在看到这肯定是一种不好的方法。我会改的。
【参考方案1】:
您可以通过在声明变量时对其进行初始化来轻松解决该问题,即使它是 null 或空值。例如:
User CurrentUser = null;
但是当你必须这样做时,它可能表明有更好的方法来排序你的逻辑。例如,而不是所有这些:
User CurrentUser;
for (int i = 0; i < users.Count; i++)
if (UsernameLogonInput == users[i].Name)
nameExists = true;
CurrentUser = users[i];
...你可以这样写:
//using System.Linq;
User CurrentUser = users.SingleOrDefault( u => u.Name == UsernameLogonInput );
这会将变量初始化为匹配的用户,如果没有找到,则将其初始化为 null。
SingleOrDefault 是 System.Linq 命名空间的扩展方法。它接受一个表达式作为参数,并将搜索列表并找到任何匹配的单个记录,如果不匹配,则为默认/空。参数是一个 lambda 表达式。
【讨论】:
请注意,如果您这样做,则根本不必跟踪nameExists
。当前用户不为空,在这种情况下名称存在,或者当前用户为空,在这种情况下名称不存在。
谢谢!我不认为我完全理解 SingleOrDefault 部分,但很高兴知道。以上是关于在 if 语句 c# 中分配变量的主要内容,如果未能解决你的问题,请参考以下文章
为啥在单个语句中分配动态对象的成员变量会导致 PHP 中的语法错误?