0

ドロップダウンの入力、フォーマット、フォーマットされたデータテーブルの返送など、多くの一般的な機能を備えた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

上記のシナリオでのいくつかの質問

  • どちらのメソッドもデータテーブルの新しいインスタンスを返しますか、それとも静的は常に同じものを返しますか?
  • 重い負荷(多くのリクエスト)の場合、これらのいずれかにスレッド関連の問題がありますか?
  • 他よりも好ましい副作用がない場合は?なんで?

あなたが少し説明を書くことができれば、それは本当に役に立ちます。

4

2 に答える 2

1

•どちらのメソッドもデータテーブルの新しいインスタンスを返しますか、それとも静的は常に同じものを返しますか?

はい、新しいインスタンスを返します。

•高負荷(多くのリクエスト)の場合、これらのいずれかにスレッド関連の問題がありますか?

メソッドで共有状態を使用しない限り、いいえ。現在はそうではありませんが、そうなる可能性があります。インスタンスメソッドでさえ、共有状態を使用する場合があります。これは静的性(静的性?)とは関係ありません

•他よりも好ましい副作用がない場合は?なんで?

それは実際には問題ではありませんが、私はインスタンスメソッドに行きます。ある時点で、テストを追加したい場合があり、インターフェースでメソッドを抽出してオブジェクトをモックすることができます。

ボーナスポイント:DataTablesは最悪です!それらを避け、クラス/オブジェクトを使用してください。

于 2012-08-22T07:12:20.787 に答える
1

個人的には、すべてのページをこのbaseWebPageの子クラスにします。
BaseWebPageクラスをインスタンス化したり、名前を入力したりすることなく(静的にする場合)、すべてのメソッドに安全にアクセスできます。

コードは次のようになります:
すべてのWebページ(MVCではなくWebフォームを使用していると仮定):

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の複数の異なるインスタンスを返すマルチスレッドを安全に使用できます。
ただし、意図した場合は、毎回同じインスタンスを返すこともできます。それはあなたが使用しているコードとリソースに依存します。

于 2012-08-22T07:32:56.223 に答える