在大多数方法中,将对象实例化为属性与对象实例化

时间:2018-10-15 16:23:42

标签: c# asp.net webforms instantiation

使用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;
    }
}

2 个答案:

答案 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提供某种服务,您希望各种方法能够访问例如日志记录,还是仅保存数据的东西,例如带有名称,年龄,身高等的人的类?