在C#中,静态方法中的变量是否自动变为静态变量是因为它们处于静态作用域中吗?

10
public static void DoSomething()
{
int a;
string b;

//..do something
}

在上面的例子中,我声明了两个变量。它们是否因为包含它们的方法是静态的而变成静态的?

不,你有没有在C#中声明静态局部变量的方法? - Adriano Repetti
可能是静态方法内部的变量共享的重复问题。 - nawfal
7个回答

10

不行,只有方法是静态的,变量不是。

根据MSDN:

C#不支持静态局部变量(在方法作用域中声明的变量)。

如果您想在静态成员中拥有静态变量,请在静态方法之外进行声明。

private static int _var = 0;
public static void SampleMethod()
{
     _var++;
} 

6
尽管C语言支持静态局部变量,但C#不支持。
如果您想要一个相当于局部静态变量的东西,可以在类上创建实例变量或静态变量。否则,请考虑该方法本身是否属于静态类,并且是否应该是不同类型的一部分。

1

来自 MSDN

C#不支持静态局部变量(在方法范围内声明的变量)。


1
我对您的意见持肯定态度,但在下面的示例代码中,我遇到了使用受保护内存而导致的访问冲突异常。因此,可能不支持静态局部变量,但在内存管理方面,它可以指向相同的地址。
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 ;
        }

0

不是,只有方法是静态的。

来自 MSDN:

C# 不支持静态局部变量(在方法作用域中声明的变量)。

以及 here:

静态修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或非类类型。

如您所见,局部变量未被提及。

然而,您可以使用静态字段:

public class MyClass
{
    private static int MyVariable = 10;

    public static void MyMethod()
    {
      MyVariable++;
    }
}

一个类可以是静态的,它可以拥有静态成员,包括函数和字段,但不包括静态作用域中的变量。

0

你不能拥有本地静态变量。

C#不支持静态本地变量(在方法范围内声明的变量)。


0

在ASP.NET中,您可以使用System.Web.HttpContext.Current.Session创建“静态”基于会话的变量。

例如:

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接