使用C#Web表单和随附的代码示例,将程序的对象实例化为类的属性(选项1)的正确方法或缺点/优点是什么?还是在每种方法中都将使用对象(选项2)? 考虑到还有更多的方法和对象,尽管大多数方法都将使用这些对象,但有一些方法并不会。
更新:
选项1:
public partial class MyPage : MyBasePage
{
//Declared as an attribute and instantiated at init
private MyClass MC;
protected void Page_Init(object sender, EventArgs e)
{
MC = new MyClass();
DoSomeStuff();
DoMoreStuff();
DoSomethingElse();
}
private void DoSomeStuff()
{
// Do stuff with MC
}
private void DoMoreStuff()
{
//Do more stuff MC
}
private void DoSomethingElse()
{
//Do some stuff WITHOUT MC
}
}
选项2:
public partial class MyPage : MyBasePage
{
protected void Page_Init(object sender, EventArgs e)
{
DoSomeStuff();
DoMoreStuff();
DoSomethingElse();
}
private void DoSomeStuff()
{
//Declared and instantiated on every method that needs it
MyClass MC = new MyClass();
// Do stuff with MC
}
private void DoMoreStuff()
{
//Declared and instantiated on every method that needs it
MyClass MC = new MyClass();
//Do some stuff with MC
}
private void DoSomethingElse()
{
//Do some stuff WITHOUT MC
}
}
更新: Sham
提供的第三个选项呢?private MyClass _MC;
private MyClass MC
{
get
{
if(_MC == null)
{
_MC = new MyClass();
}
return _MC;
}
}
答案 0 :(得分:1)
对于这种情况,您可以考虑延迟加载,以避免重复代码和不必要的实例化。
我认为您的生产代码中使用了正确的命名约定。
private MyClass _MC;
private MyClass MC
{
get
{
if(_MC == null)
{
_MC = new MyClass();
}
return _MC;
}
}
答案 1 :(得分:1)
1是否仅比另一个更好就不那么重要了。它更多地是关于您到底想做什么。因此,在方法中声明它并在该方法中使用它意味着它仅在该范围内可用。如果在类级别进行声明,然后在该类的各种方法中使用它,则在使用它时必须格外小心。让我举个例子。
在选项2上,您执行以下操作:
private void DoMoreStuff()
{
//Declared and instantiated on every method that needs it
MyClass MC MC = new MyClass();
//Do some stuff with MC
}
这意味着MC仅在DoMoreStuff内部可用。如果还要在另一个方法中创建另一个MyClass MC MC(不好称呼btw),那将是MC的完全不同的实例,与第一个实例无关。
但是,如果您使用选项1,则每个方法都可以访问它,但是每个方法都可以对其进行更改。因此,如果MC具有一个称为'Age'的属性,该属性是一个int,并且一个方法将其设置为23,然后另一个方法检查该属性应为23。另一个方法可能会在以后出现,并更新该属性并将其设置为64等。但是,这对于诸如服务之类的事物很有用,这些事物提供了执行事务的通用方法。
因此,它实际上取决于MC的用途以及如何使用。它是否为您的MyPage提供某种服务,您希望各种方法能够访问例如日志记录,还是仅保存数据的东西,例如带有名称,年龄,身高等的人的类?