0

私がaspで作業を始めたとき、phpの古き良きecho()機能を残すことはほぼ不可能であることに気づきました-私の手は文字通り、の代わりに無意識のうちにそれを入力しましたresponse.write()

したがって、.netページでは、次のようなものを作成する傾向があります。

Public Sub echo(ByVal strValue As String)
    Response.Write(strValue)
End Sub

そして、.netクラス(つまり、app_codeフォルダー内のクラス)では、次のようなものを作成する傾向があります。

Public Sub echo(ByVal strValue As String)
    HttpContext.Current.Response.Write(strValue)
End Sub

これは問題なく機能しますが、アプリケーションレベルで使用できるようにしたいので、どこでも使用できます(つまり、クラス内、aspxコードビハインドページなど)。

トリッキーなビットはapp_code内のクラスに来ます。つまり、メソッドHttpContext.Current.にアクセスするために使用する必要があります。Response.Write

パブリッククラス内で共有サブとして使用することで「グローバル」機能を使用できることは知っていますが、それでもダブルバレルを使用する必要があります(私は思いますか?)。tools.echo()

私の質問:クラスを含める必要のないグローバル関数を使用することは可能ですか?その場合、どのようにクラス対応にするか、つまり、app_codeクラス内で使用する場合は、vscodeを使用する必要がありHttpContext.Current.Response.Writeます-Response直接アクセスできるページの裏側。

私の悪い習慣はさておき、echo()実際にはコードではるかにきれいに見えますResponse.Write()&この方法でグローバルにしたい他のいくつかの方法があります-したがって私の質問:)

4

2 に答える 2

0

C#では、最上位の関数を作成することはできません。C#コンパイラの開発者であるEric Lippertが、このブログ投稿でその理由を説明しています。

C#は、初日からプロの開発者を対象とした大規模なアプリケーション開発言語として設計されました。スクリプト言語を意図したものではありませんでした。したがって、その設計は、コードの小さなチャンクでさえコンポーネントに即座に編成することを強制することを奨励します。C#はコンポーネント指向の言語です。したがって、コンポーネントベースのスタイルでのプログラミングを奨励し、そのスタイルに反する機能を推奨しません。

技術的な質問については、「できますか」と「すべきか」のどちらかを決める必要があります。

できますか:私の当面の考えは、真にグローバルで実用的なメソッドがある場合は、静的ユーティリティクラスまたはシングルトンを使用することです。それを行うことができるもう1つの「技術的な」方法は、object型から拡張メソッドを作成することです。 注意してください、後者は悪い習慣の悪臭を放ちます。

あなたがすべきこと:私のアドバイスは、C#の方法でC#のことをすることです。

于 2013-02-25T14:59:17.623 に答える
0

「ヘルパー」関数を作成して、コンテキストをパラメーターとして受け入れます。

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }

    private void LogoutUser()
    {
        Helpers.SessionHelpers.LogoutUser(this.Context);
    }
}

internal static class SessionVariableKeys
{
    internal static readonly string USER_ID = "UserId";
}

internal static class SessionHelpers
{
    internal static void LogoutUser(System.Web.HttpContext context)
    {
        context.Session[SessionVariableKeys.USER_ID] = null;
                    /* or */
        context.Session.Remove(SessionVariableKeys.USER_ID);
                    /* or */
        context.Session.RemoveAll();
        /* and */
        /* icing on the cake */
        context.Session.Abandon();

        /*context.Response.Redirect("SomePage.aspx"); */
    }

}   
于 2013-02-25T15:57:39.790 に答える