-2

まず第一に、おそらく簡単な質問だと思いますが、Google とこのフォーラムで見つけたものは、c# のゲッターとセッターを理解するのに役立ちませんでした。

Web アプリケーションのグローバル変数を作成しようとしています。

私はJavaから来ていますが、セッターとゲッターが正確にどのように機能するかわかりません。

クラスglobalvarsを作成し、そこに変数を設定したいのですが、これは私が試しているものの簡略化されたバージョンです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using System.Threading;
using MvcApplication2.Controllers;

namespace MvcApplication2
{
public static class Globals {
public static int Lang { get; set; }
}
public class MvcApplication : System.Web.HttpApplication
{
    Globals.Lang = 5;
    HomeController hc = new HomeController("nl");
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {

        filters.Add(new HandleErrorAttribute());
    }
//more code

instead of setLang I have tried 

MvcApplication2.MvcApplication.Global.setLang(5);
Global.setLang(5);
MvcApplication2.Global.setLang(5);

but they all say the method does not exist in my namespace. 

私の間違いはセッター/変数の初期化にあると思いますが、これを行う適切な方法は何ですか?

編集:私の例の間違いが修正されました

編集: Globals.Lang = 5; メソッド内でのみ使用できます??????

編集:私の実際のコード

4

4 に答える 4

3

完全を期すために以下の回答を使用して、従来の意味での「グローバル」から離れstatic、ASP.NETアプリケーションのメンバーからも離れることをお勧めします。staticメンバーのスコープはAppDomainであり、IISはワーカープロセスを管理するときに誤ってリサイクルします。これは、そこに設定した値が失われ、次回のアクセス時にデフォルト値に戻ることを意味します。


あなたが書いたもの(public static int Lang { get; set; })は自動実装プロパティであり、これは実際には通常のプロパティの特定のスタイルです。これにより、フィールドとラッピングプロパティを定義する必要がなくなります。古い手動の方法は次のとおりです。

private static int _lang;

public static int Lang
{
    get { return _lang; }
    set { _lang = value; }
}

プロパティアクセスは構文的にC#のフィールドと同じように動作するため、次のようになります。

Globals.Lang = 2;

設定方法は次のとおりです。

int value = Globals.Lang;

あなたが得る方法です。


あなたの試みには、Globalsクラスを完全に修飾しようとすることが含まれます(これはインラインまたはusingステートメントを介して必要です)。

于 2012-06-12T11:41:27.537 に答える
1

パブリックフィールドを設定するのと同じようにプロパティを設定するので、あなたの場合は

Globals.Lang = //some int value;

そのセットは本当にあなたがすべきです、私は本当にこのようなグローバルな(ハードコードされた)値の使用を再考することを意味します。テストとバージョン管理に関しては、悪夢になることがよくあります。

あなたは編集としてあなたの永続的な問題を書きました。メソッドスコープ外のものにはアクセスできません。現在のクラスのフィールドのみを初期化できるため、代入をメソッド(コンストラクターを含む)に移動する必要があります

あなたの例では、これを行うことができます

static MvcApplication(){
   Globals.Lang = 5;
}

これにより、MvcApplicationクラスの静的コンストラクターが作成され、Globals.Langプロパティに割り当てられます。

私はまだこれをしないようにアドバイスしますが、少なくともいくつかのストレージから値をロードします

また、選択した言語を覚えておきたいとコメントします。グローバルを使用すると、すべてのユーザーが同時に変更されます。AppDomain(つまり、AppPool)の値は1つだけです。

于 2012-06-12T11:39:23.917 に答える
0

setLang( "EN");の代わりに、これを試してください

Globals.Lang = Some_INT_Value; // or "EN" if the property is of string type
于 2012-06-12T11:40:10.790 に答える
0

まず、Langプロパティはintまだ文字列に設定しようとしているので、最初にそれを変更します。

次に、変数を次のように設定します。

Globals.Lang = 5; //assuming it was meant to be an int not string
于 2012-06-12T11:40:23.247 に答える