【问题标题】:Declaring a non-static class as static将非静态类声明为静态
【发布时间】:2013-03-23 16:33:59
【问题描述】:

我有一个名为A 的静态类:

public static class A
{
}

还有一个名为 B 的类,它不是静态的:

public class B
{
}

之后,我将非静态类B 声明为静态:

public class c
{
    // declare a non static class (B) as static
    public static B b = new B();
}

A(静态类)和b(非静态类声明为静态类)有什么区别?

【问题讨论】:

  • 一个是静态的,另一个不是?

标签: c# static static-methods non-static


【解决方案1】:

static class 中,您只能声明静态成员(方法、字段、属性)。在非静态类中,您可以声明静态成员和实例(非静态)成员。

此外,您不能从静态类派生类、实例化它或将其用作类型参数。


当你定义一个静态成员时:

public static B b = new B();

...那么您是说B 类型的此字段b 仅属于您声明它的类型。非静态字段属于该类型的实例。


例如,如果您有:

class MyClass
{
    public static string myStaticString = "";

    public string myInstanceString = "";
}

然后,如果您更改 myInstanceString,它的值只会针对该特定实例更改:

MyClass myInstance1 = new MyClass();
MyClass myInstance2 = new MyClass();
myInstance1.myInstanceString = "1";
myInstance2.myInstanceString = "2";
Console.WriteLine(myInstance1.myInstanceString);  // Prints: 1
Console.WriteLine(myInstance2.myInstanceString);  // Prints: 2

但是如果你改变myStaticString,它的值对于使用该类型的每个人都会改变:

MyClass.myStaticString = "1";
MyClass.myStaticString = "2";
Console.WriteLine(MyClass.myStaticString);        // Prints: 2

这与 string(或您的示例中的 B)是否被声明为 static 完全无关。

【讨论】:

  • 当然,你不能实例化一个静态类(或者更确切地说,你只能拥有它的一个实例)。
【解决方案2】:

区别在于 static variablestatic class 之间的区别。 b 是非静态类型B 的静态变量,而A 是静态类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多