0

MSDN 常见问题解答其他 基本 指南似乎忽略了四个关于静态变量的快速问题。

  1. public static一样的static public吗?

    例如
    public static class Globals {...}



    static public class Globals {...}

    相同?不同的?

  2. 似乎 - 像函数一样 - in 中的变量public static class需要C#通过类的命名全局实例public static在其他类中看到状态。static为什么是这样?从幼稚的角度来看,这似乎是不直观的(它似乎public static class会提供 的单个public实例class,其中包含可用的任何公共变量)。显然情况并非如此,所以我想从C#专家那里获得一些观点,了解为什么必须在static class对象中创建成员变量static以提供访问权限。

    注意: MSDN常见问题解答包含一个非成员变量的示例static classstatic但没有讨论如果有任何差异有什么static拥有的成员public static class。)(即,如果双重static身份有任何后果怎么办?)

    例如
    public static class Globals { public static Camera camera1; }//doubly static

  3. 是否存在过适合 a 中的public static函数的public static class情况?我看你是不想暴露一些东西,但是private在这种情况下你不就是想把它们弄出来吗?(示例越简单越好,我是自学成才的,C#并且仍在尝试理解更复杂的主题,例如反射等)

  4. 奇怪的是,通过命名的全局实例,在没有关键字的情况下,apublic enum内部public static class也是可见的。static为什么static这里没有强制执行典型要求?public enum如果我使用可见而不是 a ,我应该担心什么public static enum吗?

    public static class Globals { public enum Dummy { Everything=42}; }
    //Enum is visible w/out static!

提前致谢。并为多个问题道歉,我在是否将其拆分为多个帖子时犹豫不决,但这都与C# static使用有关,所以我认为一个帖子是最合适的。

4

3 回答 3

2
  1. 根据方法规范

方法声明可能包括一组属性(第 17 节)和四个访问修饰符(第 10.2.3 节)、新(第 10.2.2 节)、静态(第 10.5.2 节)、虚拟(第 10.5.2 节)的有效组合10.5.3)、override(第 10.5.4 节)、sealed(第 10.5.5 节)、abstract(第 10.5.6 节)和 extern(第 10.5.7 节)修饰符。

顺序无关紧要

于 2012-04-30T00:37:32.777 回答
2
  1. 是的,顺序并不重要。
  2. 是的,静态类只能包含静态成员(#4 除外),但它们不必是公共的。
  3. 是的,您可以拥有公共静态方法,但您的公共静态方法使用的私有静态方法
  4. 嵌套类型声明不需要是静态的。

要记住的另一件事是 c# 中的“内部”可见性。在我的代码库中,我发现内部静态类有很多用途(大部分时间用于扩展方法)。

于 2012-04-30T00:37:42.637 回答
2

1:顺序无关紧要。为了提高可读性,有一些关于如何排序的标准,但是当编译器读取所有内容时 - 这根本不重要。

我个人认为最好将其写为“公共静态”,而不是“静态公共”。

如果您将 ReSharper 下载到您的 Visual Studio,它会预定义对修饰符的优先级,例如“static”、“public”、“readonly”等......并且会在您不遵循这些标准时建议您更正顺序的修饰符。如果您选择使用不同优先级的修饰符,您可以更改 ReSharper 的设置以适合您的首选顺序。

除此之外 - ReSharper还创造了许多其他奇迹,强烈推荐。


2:静态类只能包含静态成员。类中的“静态”意味着该类可以没有实例,并且如您所说,被声明为某种存在。成员的“静态”意味着不同的东西:通常,成员将由实例拥有。然而,静态成员归类所有——在类的所有实例之间共享,并且在没有类的实际实例的情况下使用。

public static class Math
{
    public static readonly int ZERO = 0;
}

在这里,您可以看到 ZERO 是静态的,这意味着它属于 Math 类。所以你可以这样做:

Math.ZERO

即使 Math 类不是静态的,您仍然可以通过该类本身访问 ZERO 成员。ZERO 将不是 Math 实例的成员,因为它属于类,而不属于实例 - 因此是“静态成员”。


3: Number2 也回答了这个问题。非静态类意味着它可以拥有它的实例和属于这些实例的成员,但您也可以拥有属于该类本身的类成员(静态)。

例子:

public class Quiz
{
    public static readonly int FAIL_GRADE = 45;

    public int Grade;
    public string StudentName;
}

所以每个测验都有一个成绩和一个与之相关的学生,但还有一个属于整个班级“测验”的常数,它表示什么成绩被认为是不及格成绩。

在上述情况下,您也可以简单地执行以下操作:

public const int FAIL_GRADE = 45;

因此,从逻辑上讲,您可以了解到“const”的意思是“静态只读”。但在其他情况下,当您不能使用“const”时 - 您将不得不使用“static readonly”。“const”只能出现在基本类型之前,例如“int”、“float”、“bool”等...

这是一个“静态”成员不是只读的示例:

public static class Student
{
    public static int TestsTaken = 0;

    public string Name;

    public int DoQuiz(Quiz quiz, Answers answers)
    {
        TestsTaken++;

        // Some answers checking logic and grade returning
    }
}

在上面的示例中,您可以看到 Student 类的静态成员被用作 Student 实例执行某个操作 (DoQuiz) 的次数的计数器。在这里使用它实际上并不是很好的编程,因为 TestsTaken 确实应该在 Quiz 或 School 课堂中使用。但是“静态”用法的示例仍然存在。


4:静态类中的枚举不需要“static”关键字,事实上你不能在任何地方声明一个静态枚举。枚举不被视为类的成员,而是它的子类型(可以是子类、接口、枚举等)。

在一个类中声明一个 Enum 的事实,仅仅意味着如果一个人想要使用 Enum,他也必须引用这个类。出于逻辑目的、抽象或封装的目的,它通常位于类中(在这种情况下将其声明为“私有”——因此它可以在类内使用,但不能在类外使用)。

例子:

public static class Math
{
    private enum SpecialSigns
    {
        Sigma,
        Alpha,
        Pi,
        etc
    }
}

在上面的示例中,SpecialSigns 枚举可以在 Math 类中使用,但对外不可见。

您也可以将其声明为 public,因此当一个人使用 Math 类时,他也可以使用 SpecialSigns 枚举。在这种情况下,您还可以将 SpecialSigns 值作为方法的返回类型或公共成员的类型。当 SpecialSigns 是私有的时,您不能这样做,因为外部代码无法访问它 - 不知道它的存在 - 因此无法将其理解为返回值、成员类型等。

尽管如此,SpecialSigns 枚举不是该类的成员,但仅在其识别范围内定义。

于 2012-04-30T01:09:34.873 回答