静态类与非静态类
定义:
1.在类修饰符和class关键字中,添加static关键字;也可以在修饰符前加static关键字
2.也可以在修饰符前添加static;;来标识一个类是静态类
区别:
静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用new关键字创建静态类类型的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,他防止在类的内部声明任何实例字段或方法。
静态类
特点:
1.静态类中只能包含静态成员
2.无法实例化
3.是密封的
4.不能包含实例构造函数
何时使用静态或非静态
一个类的成员和它所在的类的实例化对象无关,不依赖new出来的实例
不需要面向对象的开发
生存周期
静态:一直存在,从程序启动,执行到类文件时,一直到程序关闭。
非静态:实例化的时候,才会开始生存周期。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine(StaticClass.returnName("lisi"));
//非静态的类,在使用的时候需要实例化
NoStaticClass sc = new NoStaticClass();
Console.WriteLine(sc.returnName("wangwu"));
//Console.WriteLine(NoStaticClass.returnName("wangwu"));
Console.ReadKey();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
public static class StaticClass
{
//在静态类中只能包含静态成员
public static string name = "zhangsan";
public static string returnName(string name1)
{
return name1;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
internal class NoStaticClass
{
//非静态类中,可以声明静态的类成员
public string name = "zhangsan";
public string returnName(string name1)
{
return name1;
}
}
}
静态非静态字段
c#中静态字段和非静态字段以static标识区分,主要区别是静态字段可以直接以类名.字段名方式使用,而非静态字段必须创建类实例才可以使用。
区别
静态成员包括静态属性和静态字段,静态字段一般实现为private,静态属性一般实现为public,从而来体现类的封装性
静态成员和类相关联,不依赖于对象而存在,只能由类来访问;实例成员与具体类相关联,只能由对象实例访问
静态成员不管创建多少实例对象,都在内存中只有一份,实例成员每创建一个实例对象,都会在内存中分配一块内存区域
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(test.v1);
Console.WriteLine((new test()).v2);
}
}
class test
{
public static string v1
{
get
{
return "v1";
}
}
public string v2
{
get
{
return "v2";
}
}
}
}
静态方法和非静态方法
使用了static 修饰符的方法为静态方法,反之则是非静态方法。
静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。
1)static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用。static内部只能出现static变量和其他static方法,而且static方法中还不能使用this等关键字,因为它是属于整个类。
2)静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
3)静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
4)那么在程序中什么地方可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数据,比如连接字符串,配置信息等,当满足上面所说的两点时,进行一次读取,以后就可以方便的使用了,同时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例,它的静态字段永远都只有一个副本。
静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员。因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员。公用的处理函数,使用静态方法应该没有问题,牵涉到数据共享,静态变量的函数要多考虑,静态变量要小心使用。
静态方法:
原理就是共享代码段;
共享代码段不会产生任何问题;
因为代码段都是给CPU作为"读取"用的,除非你进行恶意"修改"运行时的代码段;
所以静态方法是可以放心使用的;
区别
1.静态方法不需要类实例化就可以调用,反之非静态方法需要实例化后才能调用;
2.静态方法只能访问静态成员和方法,非静态方法都可以访问;
3.静态方法不能标记为override,导致派生类不能重写,但是可以访问;
4.静态成员是在第一次使用时进行初始化。非静态的成员是在创建对象的时候,从内存分配上来说静态是连续的,非静态在内存的存储上是离散的,因此静态方法和非静态方法,在调用速度上,静态方法速度一定会快点,因为非静态方法需要实例化,分配内存,但静态方法不用,但是这种速度上差异可以忽略不计
何时使用
1.一个方法和他所在类的实例对象无关,不依赖new出来的实例,那么它就应该是静态的
2.不需要面向对象的理念的时候用静态;比如动物-> RUN ,因为你可能会扩展出猫 run、狗 run,这时候就需要用非静态的方法
为什么要用非静态方法
因为方法需要重复的调用,每次都去new一次会造成内存的开销,使用静态的方法就会一直在内存中,不需要重新new一块空间初始化数据;
方法不依赖new出来的内容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(test.v1);
Console.WriteLine((new test()).v2);
}
}
class test
{
public static string v1
{
get
{
return "v1";
}
}
public string v2
{
get
{
return "v2";
}
}
}
}