为什么静态类只能有静态成员?
静态类不能实例化,因此它不会有任何实例,非静态成员会需要它们的类的实例来访问。由于静态类不能有任何实例,因此如果有静态类,就不能访问非静态成员。
因此静态类只能有静态成员
大概是因为实例方法可能永远不会被调用。
如果你把一个非静态成员放在一个静态类中,它不会是一个静态类。 (你不能实例化一个静态类 - 要有非静态成员,你必须能够创建类的实例来调用这些成员 - 这将使它成为一个普通类)
要看看它另一种方法是,通过将类标记为静态,您故意要求编译器不要让您将非静态方法放入该类中 - 这是您做出的一项设计决策,编译器可帮助检查您是否遵循了自己的方法设计。
静态类无法实例化。因此,非静态成员永远无法访问。
如果要混合和匹配静态成员,请不要使该类为静态。
这不是一个设计决定,而是一个合乎逻辑的决定。最容易开始的地方是查看概念的相关定义:
静态类是一个无法实例化的类。这意味着您不能创建该类的类型的对象。
非静态成员绑定到一个类的特定实例。它们包含与专有关联的数据,其中包含该类类型的单个对象。因此,如果静态类包含非静态成员,则永远不能访问该数据或调用该方法,因为您永远不会实例化该静态类的类型的对象。相反,您必须拥有所有可从该类的静态实例直接调用的静态成员。
但是,您可以具有包含静态成员的非静态类。这样,您可以访问数据或调用暴露为静态成员的方法,而无需实例化该类的对象。但是,您也可以也实例化该类的类型的对象并访问非静态(或实例)成员。例如,如果您有类Circle
,则可以使用静态成员,如CalculateArea
函数和PI
字段。这些成员通常只适用于所有的圈子,因为他们是圈子。但是您也可以拥有与该类别的特定实例相关联的非静态成员,因为它们描述了特定的圆对象。这些可以是字段Diameter
和Circumference
。给定存储在特定实例的非静态字段中的数据,您也可以具有计算圆的面积的非静态函数。
我不确定这是否相关,但(至少在c#.net 4.0中)静态类可以包含包含非静态成员的非静态类定义。因此,您可以将非静态成员添加到静态类,因为嵌套类型被认为是member。
例子:
public static class MyClass
{
/// <summary>
/// This non-static class is accessible and able to be instantiated through the
/// static class MyClass.
/// </summary>
public class Type1
{
public String prop1 { get; set; }
public String funct1(String result)
{
return result;
}
}
/// <summary>
/// This function is inaccessible since it requires an instance of MyClass.
/// It will also cause a compile error.
/// </summary>
/// <returns></returns>
public String nonStaticFunc()
{
return "aString";
}
/// <summary>
/// This function is accessible through the MyClass type because it is also static
/// and therefore does not require a class instance.
/// </summary>
/// <returns></returns>
public static String staticFunc(String str)
{
return str;
}
}
正如你所看到的,静态MyClass类有一个非静态类定义的Type1必须为了使用被实例化。而MyClass中的静态函数staticFunc不需要访问实例。
//Valid operations
String result = MyClass.staticFunc("result"); //No class instance.
MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
someObj.prop1 = someObj.funct1("hi");
听起来有点家庭作业......你有没有想过这件事?有什么目的可以允许静态类中的非静态成员? – mpen 2010-12-11 07:16:21
我知道规则'静态类不能有非静态成员'。但我想明白为什么。事实上,我期望在内存方面有更多令人讨厌的答案,如何存储静态类和它们的成员以及如何存储非静态类和成员。 :) – NLV 2010-12-11 08:57:15