C# ASP.Net中的NullReferenceException错误

C# ASP.Net中的NullReferenceException错误,c#,asp.net,class,oop,nullreferenceexception,C#,Asp.net,Class,Oop,Nullreferenceexception,在下面的代码中,我在使用“Names.Add(string)”方法时遇到一个空引用异常错误。但当我使用NamedDB类的静态类或静态对象时,它工作得很好。有人能解释对象实例在ASP.NETWeb应用程序中是如何工作的吗?为什么我在非静态对象中出错,而静态对象工作正常 public partial class _Default : System.Web.UI.Page { NameDB Names; //Creating Object protected void Page_Lo

在下面的代码中,我在使用
“Names.Add(string)”
方法时遇到一个
空引用异常
错误。但当我使用
NamedDB
类的静态类或静态对象时,它工作得很好。有人能解释对象实例在ASP.NETWeb应用程序中是如何工作的吗?为什么我在非静态对象中出错,而静态对象工作正常

public partial class _Default : System.Web.UI.Page
{

   NameDB Names; //Creating Object

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Names = new NameDB();//Instantiation
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        Names.Add("dss");//Object Reference is null

        GridView1.DataSource = Names.GetName();
        GridView1.DataBind();
    }
}


    //NamedDB class

    public class NameDB
    {
        List<string> Names=new List<string>();

        public void Add(string item)
        {
            Names.Add(item);
        }

        public string Remove(string item)
        {

            Names.Remove(item);
            return item;
        }

        public List<string> GetName()
        {

            return Names;
        }

    }
public分部类\u默认值:System.Web.UI.Page
{
NameDB Names;//正在创建对象
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!Page.IsPostBack)
{
名称=新名称数据库();//实例化
}
}
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
Names.Add(“dss”);//对象引用为空
GridView1.DataSource=Names.GetName();
GridView1.DataBind();
}
}
//NamedDB类
公共类名称数据库
{
列表名称=新列表();
公共无效添加(字符串项)
{
名称。添加(项目);
}
删除公共字符串(字符串项)
{
名称。删除(项目);
退货项目;
}
公共列表GetName()
{
返回姓名;
}
}

您没有在回发之前实例化的全局对象实例。在
按钮1\u单击

现在,您希望集合在回发之间保存数据,但只有将数据存储在某个位置,如
数据库
文件
会话
视图状态
缓存
,才能获取数据。会话和视图状态并不用于存储该类型的数据

protected void Button1_Click(object sender, EventArgs e)
{
    Names = new NameDB();//Instantiation
    Names.Add("dss");//Object Reference is null
    GridView1.DataSource = Names.GetName();
    GridView1.DataBind();
}

您没有在回发之前实例化的全局对象实例。在
按钮1\u单击

现在,您希望集合在回发之间保存数据,但只有将数据存储在某个位置,如
数据库
文件
会话
视图状态
缓存
,才能获取数据。会话和视图状态并不用于存储该类型的数据

protected void Button1_Click(object sender, EventArgs e)
{
    Names = new NameDB();//Instantiation
    Names.Add("dss");//Object Reference is null
    GridView1.DataSource = Names.GetName();
    GridView1.DataBind();
}
替换此项:

NameDB Names; //Creating Object
由此

NameDB Names = new NameDB(); //Creating Object
替换此项:

NameDB Names; //Creating Object
由此

NameDB Names = new NameDB(); //Creating Object

您可以执行以下任何操作

public partial class _Default : System.Web.UI.Page
{
   NameDB Names= new NameDB();//Creating Object
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {

        Names.Add("dss");

        GridView1.DataSource = Names.GetName();
        GridView1.DataBind();
    }
}


您可以执行以下任何操作

public partial class _Default : System.Web.UI.Page
{
   NameDB Names= new NameDB();//Creating Object
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {

        Names.Add("dss");

        GridView1.DataSource = Names.GetName();
        GridView1.DataBind();
    }
}


问题是每个请求都会重新创建页面对象。因此,每次调用都会重新初始化页面级字段。而回复只是另一个请求

如果希望在请求之间持久化值,则需要找到存储这些值的方法。 有些选择是:

  • 在真实的数据库中,需要一些工作,但您拥有完全的控制和完全的持久性
  • 在或中,对于应用程序范围的存储,每个访问者都获得相同的值,但当应用程序回收时,这些值将丢失
  • 在中,对于特定于用户的存储,只要会话未超时(且应用程序未回收)
  • 在中,对于“特定于回发”的存储:这将通过回发到同一页(特定于用户)来保留值,但当用户转到另一页时,这些值将丢失

问题在于,每次请求都会重新创建页面对象。因此,每次调用都会重新初始化页面级字段。而回复只是另一个请求

如果希望在请求之间持久化值,则需要找到存储这些值的方法。 有些选择是:

  • 在真实的数据库中,需要一些工作,但您拥有完全的控制和完全的持久性
  • 在或中,对于应用程序范围的存储,每个访问者都获得相同的值,但当应用程序回收时,这些值将丢失
  • 在中,对于特定于用户的存储,只要会话未超时(且应用程序未回收)
  • 在中,对于“特定于回发”的存储:这将通过回发到同一页(特定于用户)来保留值,但当用户转到另一页时,这些值将丢失

但这样,您将永远不会得到超过一个“dss”名称,因为每次通话都会重新创建“NameDB”。谢谢Adil,您能告诉我它在静态情况下是如何工作的吗?如果“staticnamedbname”有效,我知道所有用户的静态集合都是相同的。我想知道在WEB情况下静态是如何保存在内存中的。你可以使用缓存,但你应该注意需要存储的数据的大小,但这样你将永远不会得到超过单个“dss”名称,因为每次调用都会重新创建“NameDB”。谢谢Adil,你能告诉我它在静态情况下是如何工作的吗?如果“staticnamedbname”有效,我知道所有用户的静态集合都是相同的。我想知道在WEB情况下静态存储在内存中的方式。你可以使用缓存,但你应该注意需要存储的数据大小,