关于MSDN Faq和other basic guides似乎忽略的静态变量的四个快速问题。
public static
与static public
相同吗?
例如
public static class Globals
{...}
与
static public class Globals
{...}
相同的吗?不同?
似乎 - 就像函数一样 - public static class
中的C#
中的变量需要public static
状态才能通过static
类在其他类中看到命名全局实例。为什么是这样?从幼稚的角度来看,这似乎是不直观的(似乎public static class
会提供public
的单一class
实例,其中任何公共变量都可用。显然情况并非如此,因此我希望C#
专家提供一些观点,了解为什么必须在static
class
对象static
中设置成员变量以提供访问权限。
(注意: MSDN Faq包含非static
class
与static
成员变量的示例,但是如果static
成员public static class
有static
的差异,那么会有什么不同的讨论。(即如果双重public static class Globals
{ public static Camera camera1; }//doubly static
状态会产生什么后果呢?) br />例如
public
是否有static
个public static class
非private
函数适用于C#
的情况?我可以看到你不想暴露某些东西,但是你不想在这种情况下让它们public enum
。 (示例越简单越好,我在public static class
自学成才,并且仍在尝试理解更复杂的主题,如reflection等。
static
内的static
奇怪地通过指定的全局实例可见而没有public enum
关键字。为什么这里没有强制执行典型的public static enum
要求?如果我使用可见的public static class Globals
{ public enum Dummy { Everything=42}; }
而不是//Enum is visible w/out static!
,我有什么可担心的吗?
C#
static
提前致谢。对于多个问题道歉,我一直在讨论是否将其拆分为多个帖子,但这些都与{{1}} {{1}}使用有关,所以我认为一个帖子是最合适的。
答案 0 :(得分: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)
要记住的另一件事是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枚举不是该类的成员,但只是在其认可的范围内定义。