无法在静态方法中创建静态变量?

时间:2009-10-29 19:43:52

标签: c#

为什么这不起作用?

public static int[] GetListOfAllDaysForMonths()
{
    static int[] MonthDays = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};

    return MonthDays;
}

我不得不在方法之外移动变量声明:

    static int[] MonthDays = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
public static int[] GetListOfAllDaysForMonths()
{
    return MonthDays;
}

另外,通过这种方式创建它,我们只有一个这个数组的实例在内存中浮动?此方法位于静态类中。

4 个答案:

答案 0 :(得分:17)

C#根本不支持静态本地。静态的任何东西都需要是类型或类型本身的成员(即静态类)。

Btw,VB.Net确实支持静态本地,但它是通过在编译时重写代码将变量移动到类型级别(并使用Monitor类锁定初始赋值以实现基本线程安全性)来完成的。

[接受后附录]
就个人而言,您的代码示例对我来说看起来毫无意义,除非您将其与实际月份联系起来。我会做这样的事情:

public static IEnumerable<DateTime> GetDaysInMonth(DateTime d)
{
    d = new DateTime(d.Year, d.Month, 1);
    return Enumerable.Range(0, DateTime.DaysInMonth(d.Year, d.Month))
             .Select(i => d.AddDays(i) );
}

另请注意,我没有使用数组。 Arrays should be avoided in .Net,除非你真的知道为什么要使用数组而不是别的东西。

答案 1 :(得分:8)

您只能在类/ struct范围中创建静态变量。它们是静态的,意味着它们是在类型(而不是方法)上定义的。

这就是C#使用术语“静态”的方式,这与其他语言中使用“静态”的方式不同。

答案 2 :(得分:0)

在方法中声明的静态变量的范围是什么?我不认为CLR支持方法静态变量,是吗?

答案 3 :(得分:0)

嗯,除了没有得到支持,你为什么要这样做?如果你需要在方法中定义一些东西,它有局部范围,显然不需要任何东西。

相关问题