C#静态

静态方法与非静态方法的相互调用

静态方法是属于类的;

即静态方法是随着类被加载而存在的,在加载类时程序就会为静态方法分配内存;

非静态方法是属于对象的;

即非静态方法是随着对象创建而存在的,在对象创建时程序才会为其分配内存空间;对象是在类加载之后才被创建出来

即静态方法要早于非静态方法在内存中分配空间,当静态方法在内存中存在时,非静态方法未必存在于内存;所以在静态方法中不能调用非静态方法;因为静态方法不能调用一个不存在的方法;反之,非静态方法就可以调用静态方法。

补充:调用和访问两个概念

访问:不需要创建对象

调用:需要创建对象

1:静态方法只能访问静态-------------这里是访问,不是调用,

2:非静态方法可以访问静态,也可以访问非静态-------------这里也是访问,不是调用

3:静态方法可以通过类名.直接被调用,也可以通过对象来被调用-----这里是调用,不是访问

4:而非静态方法只能通过对象来调用-----这里也是调用,不是访问

main函数是静态的,所以只能访问静态-----这里也是访问,不是调用

静态构造函数

  • 静态构造函数在类型的第一次使用时被调用;且只调用一次
  • 静态构造函数先初始化类型中的静态成员
  • 静态构造函数不允许添加访问修饰符,且必须无参数

例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace A_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            B b1 = new B();
        }
    }
    class A
    {
       public A(string str)
        {
            Console.WriteLine(str);
        }
    }
    class B
    {
        static A a1 = new A("a1");
        A a2 = new A("a2");
        static B()
        {
            a1 = new A("a3");
        }
        public B()
        {
            a2 = new A("a4");
        }
    }
}
//输出:
a1
a3
a2
a4