类级别的变量/对象是否可接受



我有一个用asp.net构建的简单网站。它通常一次只有1到2个用户。我的问题是,在类级别实例化一个类可以吗?还是应该为每个方法实例化。下面是一个例子。我有一个名为Host的类,它有一个name字段和mac字段。在我为特定页面编写的代码中可以这样做吗:

public partial class addhosts : Page
{
     private Host host = new Host();
     private HostDal dal = new HostDal();
     protected void myMethod()
     {
          host.Name = "myname"
          host.Mac = "mymac"
     }
     protected void btnSubmit_Click(object sender, EventArgs e)
     {
          dal.AddHost(host)
     }
}         

首先,您所指的通常被称为globallocal变量。

在您列出的简单情况下,最好在提交单击时创建变量。原因是,如果用户加载了对象,但从未调用submit click,那么在不需要的时候,您已经在内存中实例化了主机对象。

然而,正如许多人所说,在这里,不应该真的很重要。但是,这又是一个简单化的例子。全局变量可能是危险的,并且经常被避免,因为它们可以从类中的任何位置进行修改。如果一个方法期望某个值被覆盖,这可能会在更复杂的示例中导致难以调试的问题

以下是一篇维基百科文章,重申了我的上述观点:

他们通常被认为是不良行为,正是因为他们非局部性:全局变量可能从任何位置(除非它们位于受保护的内存中或其他位置呈现为只读),并且程序的任何部分都可能依赖于它

为了去掉全局变量,您可以这样做(使用对象初始化器)

protected void btnSubmit_Click(object sender, EventArgs e)
{
      var host = new Host
          {
              Name = "myname",
              Mac = "mymac"
          };
      dal.AddHost(host)
}

将特定于用户的数据作为字段放在ASP.Net页面实例中是完全可以的。每次访问页面都会创建Page类的新实例,因此您不会出现用户之间数据共享不正确的情况。

这应该没关系。

对您页面的每个请求都是单独的,并且不知道其他请求,因此不可能与其他请求发生"冲突"。

这非常好,因为每个用户都会创建新的类(设计为ASP.NET)。它也在单独的线程中,所以在这种情况下,即使是静态变量也是可以接受的。

干杯,Ivan

最新更新