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

4

我有一个用asp.net构建的简单网站。通常一次只有1或2个用户。我的问题是,是否可以在类级别上实例化一个类,还是应该为每个方法实例化。这里有一个例子。我有一个名为Host的类,其中包含一个名称字段和一个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)
     }
}         

2
取决于你想让它如何运作! - c0deNinja
4个回答

2
首先,您所指的更通常被称为全局变量和局部变量。
在您列出的简单情况下,最好在提交点击时创建变量。原因是如果用户加载了对象,但从未调用提交点击,则在没有必要时在内存中实例化主机对象。
然而,正如许多人所说,这里真的不应该有什么区别。但是,这是一个简单的示例。全局变量可能很危险,并且通常会避免使用它们,因为它们可以从类中的任何位置修改。如果一个方法期望某个值,然后被覆盖了,这可能会在更复杂的示例中导致难以调试的问题。
这是一个维基百科文章,重申了我上面的观点:

它们通常被认为是不良实践,正是因为它们的非局部性:全局变量可能会从任何地方(除非它们驻留在受保护的内存中或以其他方式设为只读)进行修改,并且程序的任何部分都可能依赖于它

要摆脱全局变量,您可以这样做(使用对象初始化程序)。
protected void btnSubmit_Click(object sender, EventArgs e)
{
      var host = new Host
          {
              Name = "myname",
              Mac = "mymac"
          };
      dal.AddHost(host)
}

谢谢,我意识到这只是一个简单的例子。我想更好的问题应该是这是不好的做法吗?如果我将其实例化在另一个方法内部,我怎么将主机信息传递给submit方法呢? - user1279156
如果您不介意的话,我可以再提出一个问题。假设在页面加载时,我从数据库中读取主机名,然后将主机名分配给文本框,用户可以更改名称,然后在提交时将主机发送回数据库。使用您的建议,我需要两次实例化或初始化主机,一次在页面加载时,一次在提交时,这样正确吗?似乎只需要一次并根据需要更改值更有意义。再次感谢。 - user1279156
但是请记住,HTML是无状态的(ASP通过狡猾的手段将其混淆使其看起来是有状态的),因此您无论如何都需要实例化对象两次。 - Justin Pihony

1

这并不重要。

每个对您页面的请求都是独立的,没有其他请求的知识,因此不存在与其他请求发生“冲突”的可能性。


1

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


0

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

祝好,伊万


你确定这个吗?我不会弄一个测试页面,但静态变量在不同的线程之间是可访问的,一般来说,如果你将某些东西存储在静态变量中,不同的会话应该能够获取它... - Chris
没有任何地方提到icesar或OP说变量是静态的!静态变量是一种不同的实体,可以跨整个应用程序池持续存在。在OP的示例中,每当请求添加主机页面时,都会创建该类的新实例。变量位于类级别,因此每个用户请求都有自己的实例。 - Nick Bork
“所以即使在这种情况下,静态变量也是可以接受的” - icesar。那句话不正确。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接