天天看点

C#中的static关键字的理解

因为最近工作中常常使用到static关键字,所以在此系统的整理一下,夯实下基础。

基础概念

静态类中只能有静态成员,不可以有非静态字段;

非静态类可以有非静态成员和静态成员;

静态方法只能直接访问访问本类中的静态成员,可以访问到的其它类中的所有成员;

非静态方法能访问本类中的所有成员和可以访问到的其它类中的所有成员;

静态成员属于类所有,非静态成员属于类的实例所有。

每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;如下

// An highlighted block
public class Dao
    {
    public static string allData = "aa";
    public string data = "bb";
    }
class StaticDemo
{
    Dao a,b,c,d;//a,b,c,d可以不通过实例化来访问allData,例如Dao.allData
    
    b = new Dao();
    a = new Dao();//此时为data 分配一块存储,而allData 直接在程序初始化时加载了,所以静态成员在内存中只占同一块区域.
}
           

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

静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

为什么要使用static

想象一个场景,你定义了一个数据库操作类dao,以及一个变量allData用来储存某张表中查询的所有值,如下。

你如果需要使用allData,那么你就得对Dao进行实例化,然后进行调用。

但是如果你很多地方需要使用呢,那么你就得不停的实例化。

所以这个时候就得使用静态变量。

// 非静态
public class Dao
    {
    public List<testVo> allData = 数据库查询代码;
    }
public class TestDao
    {
    DAO dao = new Dao();
    List<testVo> data = dao.allData;
    }

    //静态
public class Dao
    {
    public static List<testVo> allData = 数据库查询代码;
    }
public class TestDao
    {
    List<testVo> data = TestDao.allData;
    }
           

static什么时候使用

static 的优点就如上所示,可以免于去不停使用new关键字。但是如果该变量或者类会很少用到,那么就无需使用static,因为初始化加载,比较占内存,所以不经常用的方法,不建议加此关键字。

还有就是考虑系统资源的安全性,例如一个员工类和一个老板类,我们就可以给老板类加上static,避免new出来多个老板。