我正在使用C#
我正在尝试检查我的登录尝试是否不超过3,我的意思是以下条件
if (((int)Session["LoginAttempt"]) != 3)
{
}
在登录失败的情况下,我正在执行如下增量:
Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;
但它给了我错误“对象引用未设置为对象的实例。”
请建议!
答案 0 :(得分:19)
抱歉伙计,
我刚从
更改了整数转换代码((int) Session["LoginAttempt"])
到
Convert.ToInt32(Session["LoginAttempt"]) + 1;
现在它对我来说工作正常,请在其中提出任何问题。
谢谢!
答案 1 :(得分:7)
尝试魔法代码:
Session["LoginAttempt"] = ((int?)Session["LoginAttempt"] ?? 0) + 1;
这会将会话变量Session["LoginAttempt"]
转换为可空int
(int
null
?? 0
Session["LoginAttempt"]
提供值0为null,因此计算成功。
如果{{1}}之前未初始化,则{{1}}可以为空。
答案 2 :(得分:4)
您需要先测试Session
变量是否存在,然后再使用它并分配给它。
这里你正在做一个增量:
Session["LoginAttempt"] = ((int) Session["LoginAttempt"]) + 1;
但是,如果Session["LoginAttempt"]
不存在,这将解释您的错误。在增量之前进行快速null
测试应该对其进行排序。
if (Session["LoginAttempt"] != null)
Session["LoginAttempt"] = ((int)Session["LoginAttempt"]) + 1;
答案 3 :(得分:3)
为什么不将LoginAttempt值封装为属性并自动分配值:
protected int LoginAttempt
{
get
{
if (Session["LoginAttempt"] == null)
{
Session["LoginAttempt"] = 1;
}
return Convert.ToInt32(Session["LoginAttempt"].ToString());
}
set
{
Session["LoginAttempt"] = value;
}
}
这样函数的主体更具可读性:
if (LoginAttempt < 3)
{
}
答案 4 :(得分:1)
如果您之前没有初始化它,它会在您第一次尝试设置时执行此操作。试试这个:
if (Session["LoginAttempt"] == null)
Session["LoginAttempt"] = 1;
else
((int)Session["LoginAttempt"]) += 1;
答案 5 :(得分:0)
将您的非平凡代码分成几部分:
int sessionLogicAttempt = (int)Session["LoginAttempt"];
int someValue = sessionLogicAttempt + 1;
Session["LoginAttempt"] = someValue;
此外,添加断言以检查您所假设的值。
答案 6 :(得分:0)
//read
object attemptObj = Session["LoginAttempt"]
int attempt = 0;
if (attemptObj != null) attempt = (int)attemptObj ;
////write
Session["LoginAttempt"] = attempt++;
答案 7 :(得分:0)
尽量确保不要施放可能为空值的东西。
int i = Session["val"] == null ? 0 : (int)Session["val"];
虽然如果其他程序员使用你的“val”会话并将非int值放在那里,这可能会搞砸你。
int y = 0;
if (int.TryParse(Session["val"] == null ? string.Empty : Session["val"].ToString(), out y))
{
// got your int value
}
else
{
// no int value in session val
}