最佳方法从静态vs实例方法返回新对象/实例

时间:2012-08-22 07:07:51

标签: asp.net methods static instance

我们有一个Basewebpage类,它有许多常用功能,如填充下拉列表,格式化,返回格式化数据表等等。

什么是好方法。

Public Class BaseWebPage
{
 ...

    public static DataTable Static_GetPersonDataTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Age");

        return dt;
    }
  ...
    public DataTable NonStatic_GetPersonDataTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Age");

        return dt;
    }
}

这两者都可以被称为

DataTable dt1 = BaseWebPage.Static_GetPersonDataTable();  // calling static method
...
BaseWebPage pageBase = new BaseWebPage();
DataTable dt2 = pageBase.NonStatic_GetPersonDataTable();  // calling non-static method

上述情景中的几个问题

  • 两个方法都会返回一个数据表或静态的新实例将始终返回相同的内容吗?
  • 在重载(许多请求)的情况下,是否会出现与这些相关的线程问题?
  • 如果没有比其他副作用更好的副作用?为什么?

如果你能写一点点描述,那将非常有帮助。

2 个答案:

答案 0 :(得分:1)

•两个方法都返回数据表或静态的新实例将始终返回相同的内容吗?

是的,他们将返回一个新实例。

•在繁重负载(许多请求)的情况下,是否会出现任何线程相关的问题?

否,除非您在方法中使用共享状态。目前他们没有,但他们可能。甚至实例方法也可以使用共享状态。这与静态无关(静态?)

•如果没有比其他副作用更好的副作用?为什么呢?

这并不重要,但我会选择方法。在某些时候,您可能希望添加测试,并且可以在界面中提取方法并模拟对象。

奖励点: DataTables很糟糕!避免使用它们并使用类/对象。

答案 1 :(得分:1)

我个人会让你的所有页面都成为这个baseWebPage的子类 您可以安全地访问所有方法,而无需实例化BaseWebPage类甚至输入名称(进入静态时)。

代码就像这样:
您的所有网页(假设您使用的是webforms而不是mvc):

public partial class Index : BaseWebPage{
    protected void Page_Load(object sender, EventArgs e){
        var data = GetPersonDataTable();
    }
}

您的baseWebPage:

Public Class BaseWebPage : System.Web.UI.Page{
    protected DataTable GetPersonDataTable(){
        //Do your thing
    }
}

关于安全和行为:这取决于您在这些方法中编写代码的方式 但是在静态和非静态中,您可以安全地让多个线程返回DataTable的多个不同实例。
如果有意,您也可以每次都返回相同的实例。这取决于您使用的代码和资源。