public static void DoSomething()
{
int a;
string b;
//..do something
}
上記の例では、2 つの変数を宣言しています。それらを含むメソッドが静的であるため、それらは静的になりますか?
いいえ。メソッドのみが静的であり、変数ではありません。
MSDN から:
C# は、静的ローカル変数 (メソッド スコープで宣言されている変数) をサポートしていません。
静的メンバーに静的変数を持ちたい場合は、静的メソッドの外で宣言を行い、
private static int _var = 0;
public static void SampleMethod()
{
_var++;
}
C では使用できますが、静的ローカル変数は C# ではサポートされていません。
ローカルの静的変数に相当するものが必要な場合は、クラスにインスタンス変数を作成するか、静的変数を作成できます。それ以外の場合は、メソッド自体が静的クラスに属しているかどうか、および別の型の一部であるべきかどうかを検討してください。
私はあなたの意見に賛成ですが、以下のサンプル コードでは、保護されたメモリの使用に関するアクセス違反の例外を取っています。そのため、静的ローカル変数をサポートしていない可能性がありますが、メモリ管理では同じアドレスを指すことができます。
public static byte[] RawSerialize(object anything)
{
int rawsize = Marshal.SizeOf(anything);
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.StructureToPtr(anything, buffer, false);
byte[] rawdata = new byte[rawsize];
Marshal.Copy(buffer, rawdata, 0, rawsize);
Marshal.FreeHGlobal(buffer);
return rawdata ;
}
MSDNから
C# は、静的ローカル変数 (メソッド スコープで宣言されている変数) をサポートしていません。
いいえ、メソッドのみが静的です。
MSDNから:
C# は、静的ローカル変数 (メソッド スコープで宣言されている変数) をサポートしていません。
そしてここに:
static 修飾子は、クラス、フィールド、メソッド、プロパティ、演算子、イベント、およびコンストラクターで使用できますが、インデクサー、デストラクター、またはクラス以外の型では使用できません。
ご覧のとおり、ローカル変数は言及されていません。
ただし、静的フィールドを使用できます。
public class MyClass
{
private static int MyVariable = 10;
public static void MyMethod()
{
MyVariable++;
}
}
クラスは静的にすることができ、関数とフィールドの両方の静的メンバーを持つことができますが、静的スコープ内の変数は持つことができません。
ローカルの静的変数を持つことはできません。
C# は、静的ローカル変数 (メソッド スコープで宣言されている変数) をサポートしていません。
System.Web.HttpContext.Current.Sessionを使用して、ASP.NET 内に "静的な" セッション ベースの変数を設定できます。
例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace SomeNameSpace
{
public static class CSession
{
private static readonly string zE = "";
private static readonly string CrLF = Environment.NewLine;
/// <summary>
///
/// </summary>
public static bool HasSession { get { return HttpContext.Current != null && HttpContext.Current.Session != null; } }
/// <summary>
/// Get a session variable
/// </summary>
/// <param name="pSessionKey"></param>
/// <returns></returns>
public static object Get(string pSessionKey)
{
object t = null;
try
{
if (HasSession && HttpContext.Current.Session[pSessionKey] != null) { t = (object)HttpContext.Current.Session[pSessionKey]; }
}
catch (Exception ex) { t = null; string m = ex.Message; }
return t;
}//object Get(string pSessionKey)
/// <summary>
/// Set a session variable
/// </summary>
/// <param name="pSessionKey"></param>
/// <param name="pObject"></param>
public static void Set(string pSessKey, object pObject)
{
if(!HasSession) { return; }
HttpContext.Current.Session.Remove(pSessKey);
HttpContext.Current.Session.Add(pSessKey, pObject);
}//void Set(string pSessionKey, object pObject)
public static string GetString(string pSessKey)
{
string sTemp = zE;
object t = Get(pSessKey);
if (t != null) { sTemp = (string)t; } else { sTemp = zE; }
return sTemp;
}//string GetString(string pSessionKey)
public static int GetInt(string pSessKey)
{
int s = 0;
object t = Get(pSessKey);
if (t != null) { s = (int)t; }
return s;
}//int GetInt(string pSessionKey)
public static Int32 GetInt32(string pSessKey)
{
Int32 s = 0;
object t = Get(pSessKey);
if (t != null) { s = (Int32)t; }
return s;
}//Int32 GetInt32(string pSessionKey)
public static bool GetBool(string pSessKey)
{
bool s = false;
object t = Get(pSessKey);
if (t != null) { s = (bool)t; }
return s;
}//bool GetBool(string pSessionKey)
}//public static class CSession
}