我有一个用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)
}
}
首先,您所指的通常被称为global
和local
变量。
在您列出的简单情况下,最好在提交单击时创建变量。原因是,如果用户加载了对象,但从未调用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