C#静态订单,成员变量,成员枚举

时间:2012-04-30 00:31:00

标签: c# class static enums visibility

关于MSDN Faqother basic guides似乎忽略的静态变量的四个快速问题。

  1. public staticstatic public相同吗?

    例如
    public static class Globals {...}



    static public class Globals {...}

    相同的吗?不同?

  2. 似乎 - 就像函数一样 - public static class中的C#中的变量需要public static状态才能通过static类在其他类中看到命名全局实例。为什么是这样?从幼稚的角度来看,这似乎是不直观的(似乎public static class会提供public的单一class实例,其中任何公共变量都可用。显然情况并非如此,因此我希望C#专家提供一些观点,了解为什么必须在static class对象static中设置成员变量以提供访问权限。

    注意: MSDN Faq包含非static classstatic成员变量的示例,但是如果static成员public static classstatic的差异,那么会有什么不同的讨论。(即如果双重public static class Globals { public static Camera camera1; }//doubly static状态会产生什么后果呢?) br />例如
    public

  3. 是否有staticpublic static class private 函数适用于C#的情况?我可以看到你不想暴露某些东西,但是你不想在这种情况下让它们public enum。 (示例越简单越好,我在public static class自学成才,并且仍在尝试理解更复杂的主题,如reflection等。

  4. static内的static奇怪地通过指定的全局实例可见而没有public enum关键字。为什么这里没有强制执行典型的public static enum要求?如果我使用可见的public static class Globals { public enum Dummy { Everything=42}; }而不是//Enum is visible w/out static!,我有什么可担心的吗?

    C# static

  5. 提前致谢。对于多个问题道歉,我一直在讨论是否将其拆分为多个帖子,但这些都与{{1}} {{1}}使用有关,所以我认为一个帖子是最合适的。

3 个答案:

答案 0 :(得分:2)

  1. 根据Method Specification
  2.   

    方法声明可以包括一组属性(第17节)和四个访问修饰符的有效组合(第10.2.3节),新的(第10.2.2节),静态(第10.5.2节),虚拟(第10.5.3节),覆盖(第10.5.4节),密封(第10.5.5节),摘要(第10.5.6节)和外部(第10.5.7节)修饰符。

    顺序无关紧要

答案 1 :(得分:2)

  1. 是的,订单并不重要。
  2. 是的,静态类只能包含静态成员(#4除外),但它们不必公开。
  3. 是的,您可以使用公共静态方法,但公共静态方法使用的私有静态方法
  4. 嵌套类型声明不一定是静态的。
  5. 要记住的另一件事是c#中的“内部”可见性。在我的代码库中,我发现内部静态类有很多用途(大部分时间用于扩展方法)。

答案 2 :(得分:2)

1:订单无关紧要。有更多可读性的标准,但是当编译器全部阅读时 - 它根本没有关系。

我个人觉得最好把它写成“公共静态”,而不是“静态公共”。

如果您将ReSharper下载到您的Visual Studio,它已预先确定了对“静态”,“公共”,“只读”等修饰符的优先级...并且当您不遵循这些标准时,它会建议您更正修饰符的顺序。如果您选择使用不同的修改器优先级,则可以更改ReSharper的设置以适合您的首选订单。

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


2:静态类只能包含静态成员。类中的“static”意味着类可以没有实例,并且被声明为存在,就像你说的那样。成员的“静态”意味着不同的东西:通常,成员将由实例拥有。但是,静态成员由类拥有 - 在类的所有实例之间共享,并且在没有类的实际实例的情况下使用。

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

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

Math.ZERO

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


3:这也是第二种答案。非静态类意味着它可以包含它的实例和属于实例的成员,但是你也可以拥有属于类本身的类成员(静态)。

示例:

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

    public int Grade;
    public string StudentName;
}

所以每个测验都有一个成绩和一个与之相关的学生,但也有一个常数属于全班“测验”,表明什么等级被认为是失败等级。

在上面的例子中,你也可以这样做:

public const int FAIL_GRADE = 45;

因此,从逻辑上讲,你可以知道“const”的意思是“静态只读”。 但在其他情况下,当你不能使用“const”时 - 你必须使用“静态只读”。 “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类的静态成员用作计数器学生执行某个操作(DoQuiz)的次数的计数器。在这里使用它实际上并不是很好的编程,因为TestsTaken确实应该在Quiz或School类中。但“静态”用法的例子就是。


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

在类中声明枚举的事实,只是意味着如果想要使用Enum,他也必须引用该类。它通常是用于逻辑目的,抽象或封装的类中的位置(在这种情况下会声明它是“私有的” - 所以它可以在类中使用,但不能在它之外使用)。

示例:

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

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

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

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