猿教程 Logo

C# Static

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

C#包含“static”关键字,就像其他编程语言,如C ++,Java等。Static关键字可以应用于类,变量,方法,属性,操作符,事件和构造函数。 但是,它不能用于索引器,析构函数或类以外的类。

静态修饰符使一个项目不可实例化,这意味着静态项目不能被实例化。 如果将静态修饰符应用于类,那么该类不能使用new关键字实例化。 如果静态修饰符应用于类的变量,方法或属性,那么可以直接访问它们而无需创建类的对象,只需使用className.propertyName,className.methodName。

相关实例:

public static class MyStaticClass
{
    public static int myStaticVariable = 0;

    public static void MyStaticMethod()
    {
        Console.WriteLine("This is a static method.");
    }

    public static int MyStaticProperty { get; set; }
}

class Program
{

    static void Main(string[] args)
    {
        
        Console.WriteLine(MyStaticClass.myStaticVariable);

        MyStaticClass.MyStaticMethod();

        MyStaticClass.MyStaticProperty = 100;

        Console.WriteLine(MyStaticClass.MyStaticProperty);
    }
}

运行结果:

0 
This is a static method. 
100

在上面的例子中,MyStaticClass是一个具有静态变量,方法和属性的静态类。 所有静态成员都可以使用className访问,而无需创建类的对象。 MyStaticClass.MyStaticMethod()。

也可以像非常类一样在非静态类中拥有静态成员。 您可以像平常一样使用new关键字实例化非静态类。 但是,实例变量只能访问非静态方法和变量,它不能访问静态方法和变量。

例如,参考以下myNonStaticClass与静态和非静态方法的混合:

相关实例:

public class MyNonStaticClass
{
    private static int myStaticVariable = 0;

    public static void MyStaticMethod()
    {
        Console.WriteLine("This is static method.");
    }

    public void myNonStaticMethod()
    {
        Console.WriteLine("Non-static method");
    }
}

在上面的例子中,MyNonStaticClass可以被实例化并访问非静态成员。 但是,您无法访问静态成员。 下图显示了调试视图。



静态构造函数:

静态或非静态类可以有一个静态构造函数,没有任何访问修饰符,如public,private,protected等。

非静态类中的静态构造函数仅在第一次实例化类时运行一次。

静态类中的静态构造函数只会在其第一次访问其静态成员时运行一次。

相关实例:

public static class MyStaticClass
{
    static MyStaticClass()
    {
        Console.WriteLine("Inside static constructor.");
    }
    public static int myStaticVariable = 0;

    public static void myStaticMethod()
    {
        Console.WriteLine("This is static method.");
    }

    public static int MyStaticProperty { get; set; }

}

class Program
{

    static void Main(string[] args)
    {
        
        MyStaticClass.myStaticVariable = 100;

        MyStaticClass.MyStaticProperty = 200;

        MyStaticClass.myStaticVariable = 300;

        MyStaticClass.MyStaticProperty = 400;

    }
}

运行结果:

Inside static constructor.

在上面的示例中,静态成员被访问多次。 但是,当第一次访问静态构造函数的任何静态成员时,静态构造函数只被调用一次。

相关实例:

public class MyNonStaticClass
{
    static MyNonStaticClass()
    {
        Console.WriteLine("Inside static constructor.");
    }
            
    public void myNonStaticMethod()
    {
        Console.WriteLine("Non-static method");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyNonStaticClass mnsObj1 = new MyNonStaticClass();
        MyNonStaticClass mnsObj2 = new MyNonStaticClass();
        MyNonStaticClass mnsObj3 = new MyNonStaticClass();
    }
}

运行结果:

Inside static constructor

在上面的例子中,我们实例化了MyNonStaticClass三次,但静态构造函数在第一次实例化时只调用了一次。


静态项的内存分配:

正如你所知,应用程序内存的主要部分是堆栈和堆。 静态成员存储在称为高频堆的堆内的特殊区域中。 非静态类的静态成员也存储在堆中,并在类的所有实例之间共享。 因此,一个实例所做的更改将反映在所有其他实例中。

如前所述,静态成员只能包含或访问其他静态成员,因为调用静态成员时不创建实例,因此它们无法访问非静态成员。

下图说明了静态成员如何存储在内存中:


要点
  1. 静态类不能使用new关键字实例化。

  2. 静态项只能访问其他静态项。 例如,静态类只能包含静态成员,例如变量,方法等。静态方法只能包含静态变量,并且只能访问其他静态项。

  3. 静态项目共享多个用户之间的资源。 

  4. Static不能与索引器,析构函数或类以外的类型一起使用。

  5. 非静态类中的静态构造函数仅在第一次实例化类时运行一次。

  6.  静态类中的静态构造函数只会在其第一次访问其静态成员时运行一次。 

  7. 静态成员分配在内存的高频堆区中。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/csharp-Static.html