静态
静态类不能实例化;
静态方法不能通过实例对象.来调用 只能通过类名.调用
静态方法之后调用静态属性
静态属性 能被所有本类中的方法调用
静态类就是用static 修饰的类
静态方法就是用static修饰的方法
静态类是无法被继承的
实例类中可以包含静态成员和实例成员
静态类中不能有实例构造方法 public StaticClass() { } 静态类中不能出现访问修饰符
静态类虽然不能被实例化 但是静态构造方法也能被调用
静态构造函数无访问修饰符、无参数,只有一个 static 标志。
静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且在某次运行期间只执行一次。
静态构造函数最多只运行一次。
静态构造函数不可以被继承。 所有的构造函数都不可以被继承
索引器
索引器的定义方式与属性定义方式类似,其基本的语法格式如下所示。
索引器这里引入的是一个动态数组的概念,首先根据以学可知以前的数组都是动态数组
这里我们就可以做一个动态数组,
对数组做一个初始长度的设计,一般为4,
再做一个防溢出处理,一旦溢出,对数组做扩容,
[修饰符] 数据类型 this[索引类型 index]
{
get{ //返回参数值}
set{ //设置隐式参数value给字段赋值}
}
在上述语法格式中,使用this关键字加“[索引类型 index]”的形式来创建一个索引器,在索引器中同样会使用get和set访问器,来获取属性值和设置属性值。
垃圾回收
在C#中,当一个对象成为垃圾对象后仍会占用内存空间,时间一长,就会导致内存空间的不足。为了清除这些无用的垃圾对象,释放一定的内存空间,C#中引入了垃圾回收机制。在这种机制下,程序员不需要过多关心垃圾对象回收的问题,.Net运行环境会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。
除了等待运行环境进行自动垃圾回收,还可以通过调用GC.Collect()方法来通知运行环境立即进行垃圾回收。接下来通过一个案例来演示如何使用 GC.Collect()方法进行垃圾回收。
class Program14 { static void Main(string[] args) { Student s1 = new Student(); Student s2 = new Student(); s1.Name = "s1"; s2.Name = "s2"; s1 = null; Console.WriteLine("执行GC.Collect方法:"); GC.Collect(); //通知运行环境立即进行垃圾回收操作 Console.ReadKey(); } } public class Student { public string Name { get; set; } ~Student()//析构函数,在对象被销毁时会自动调用 { Console.WriteLine(Name+":资源被回收"); } } GC.Collect()方法执行成功后,对象s1被回收了,而对象s2未被回收,这是因为将对象s1置为null,成为垃圾对象,而对象s2还存在引用,不会成为垃圾对象,因此,在执行GC.Collect()方法时,s1对象被回收了。 需要注意的是,垃圾回收操作是在后台完成的,程序结束后,垃圾回收的操作也会终止。因此,为了更好地观察垃圾对象被回收的过程,定义了Student类的析构函数,它的写法与构造方法类似,只不过需要在函数名前面加上“~”号,析构函数会在对象销毁时,被垃圾回收器调用,对于初学者来说只需了解即可
命名空间
在实际开发过程中,除了自己编写的程序外还存在引用其他程序的情况,这时可能会碰到类名相同的情况。为此,C#中引入了命名空间这个概念,可以将命名空间理解为程序定义的一个目录,使用命名空间可以有效避免类名冲突的问题
例如
namespace Example
{
class Animal
{
void Shout()
{
Console.WriteLine("动物的叫声");
}
}
}
//声明的时候并赋值
private readonly int age = 10;
private readonly staticint num1 = 0;
private readonly int num2 = 0;
private static int num3 = 0;
//静态只读字段只能在静态构造方法中赋值
static Test()
{
num1 = 222;
}
//非静态字段只能在非静态构造方法中赋值
public Test()
{
//使用readonly修饰的的常量可以在构造方法中修改多次
age = 100;
age = 200;
//静态字段可以在非静态构造方法中赋值
num3 = 33333;
//静态只读字段无法在非静态构造方法中赋值
//num1 = 11111;
}
public void Print()
{
//在非构造方法中无法对readonly修饰的常量赋值
//age = 300;
Console.WriteLine(age);
}
public static bool operator == (Student stu1,Student stu2)
{
if (stu1.name== stu2.name && stu1.age==stu2.age)
{
returntrue;
}
returnfalse;
}
public static bool operator !=(Student stu1, Student stu2)
{
if (stu1.name != stu2.name || stu1.age!=stu2.age )
{
returntrue;
}
returnfalse;
}
//结构和类的区别
//结构用来创建轻量级的东西
//类用来创建复杂对象
publicint x;
publicint y;
//不能显示的包含无参构造
//public PointStruct()
//{
//}
//在结构中显示的写出有参构造不显示的写出无参构造单依旧可以使用
public PointStruct(int x, int y)
{
this.x = x;
this.y = y;
}
publicvoid Test()
{
Console.WriteLine("***********");
}
枚举
将所有情况写入并封装成一个枚举类型,在判断的时候直接将枚举类型传入然后比对对应的内容名称返回对应的值
classProgram
{
staticvoid Main(string[] args)
{
string str = "1";
Teat((Tools)(int.Parse(str)));
}
staticvoid Teat(Tools tool)
{
switch (tool)
{
caseTools.AKM:
Console.WriteLine("GetAKM");
break;
caseTools.UMP9:
Console.WriteLine("GetUMP9");
break;
caseTools.M16A4:
Console.WriteLine("GetM16A4");
break;
caseTools.AWM:
Console.WriteLine("GetAWM");
break;
default:
break;
}
}
}
结构
结构是和类一个层次的,只是两者运用的方面不一样
//结构不能显示的包含无参构造 //public PointStruct() //{ //} //在结构中显示的写出有参构造 不显示的写出无参构造 无参构造可以正常使用