Keep on going never give up.

Let's Go

C# 学习笔记(22)静态与非静态的区别

C#Lonely2019-05-07 20:52:2631次0条

C#静态成员与非静态成员

1、静态成员属于类所有,被类的所有对象所共享,非静态成员属于类的实例所有。

2、静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。 非静态成员每创建一个实例都会分配一块新的内存。


C#静态方法

C#静态方法属于类所有,类实例化前即可使用。静态方法不要求要实例,而非静态方法需要先有一个实例。

非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,这样C#静态方法调用时无法判断非静态变量使用的内存地址,所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。


静态类的主要特性:

1、仅包含静态成员。

2、无法实例化。

3、是密封的。

4、不能包含实例构造函数。


静态成员

1、非静态类可以包含静态的方法、字段、属性或事件;

2、无论对一个类创建多少个实例,它的静态成员都只有一个副本;

3、静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量;

4、静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员;

5、虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。这样的字段属于类,不属于类的实例。因此,可以同对待静态字段一样使用ClassName.MemberName 表示法来访问 const 字段;

6、C# 不支持静态局部变量(在方法内部定义静态变量)。


静态构造函数

1、静态类可以有静态构造函数,静态构造函数不可继承;

2、静态构造函数可以用于静态类,也可用于非静态类;

3、静态构造函数无访问修饰符、无参数,只有一个 static 标志;

4、静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。


静态变量与非静态变量的区别如下: 

1、内存分配

 静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡; 而非静态变量需要被实例化后才会分配内存。 

2、生存周期 

静态变量生存周期为应用程序的存在周期; 非静态变量的存在周期取决于实例化的类的存在周期。 

3、调用方式 

静态变量只能通过“类名.静态变量名”调用,类的实例不能调用; 非静态变量当该变量所在的类被实例化后,可通过实例化的对象名直接访问。 

4、共享方式 

静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值; 非静态变量是局部变量,不共享的。 

5、访问方式 

静态成员只能访问静态成员,不能访问非静态成员; 非静态成员可以访问静态成员。


静态和非静态的区别:

(1)、在非静态类中,既可以有实例成员(非静态),也可以有静态成员。

(2)、在调用实例成员的时候,需要使用对象名.实例成员;  在调用静态成员的时候,需要使用类名.静态成员名;


总结:

1、静态成员必须使用类名去调用,而实例成员使用对象名去调用。

2、静态方法中,只能访问静态成员,不允许访问实例成员。

3、实例方法中,即可以使用静态成员,也可以使用实例成员。

4、静态类中,只允许有静态成员,不允许出现实例成员。


注意:

1、静态类在整个项目中资源共享,只有在程序全部结束之后,静态类才会释放资源。

      //内存 :堆、栈、静态存储区域(静态类存这)                释放资源   GC垃圾回收器

2、非静态类在实例化后是在内存中是独立的,它的变量不会重复,在使用后会及时销毁,所以不会出现未知的错误。

3:建议如果你想将你的类当做一个“工具类”去使用,这个时候可以考虑将类写成静态的,如:Console类。


代码示例:

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

namespace ConsoleApp
{
    class MyClass
    {        
        public void Print_1()
        {
            Console.WriteLine("我是一个非静态方法");
        }
        
        public static void Print_2()
        {
            Console.WriteLine("我是一个静态方法");
        }
        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass p = new MyClass();
            p.Print_1(); //调用非静态方法用对象名.方法名();来调用。
            MyClass.Print_2();//调用静态方法用类名.方法名();来调用
            Console.ReadKey();
        }
    }
}





暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!