C# 细节部分结构、泛型、资源清理

it2023-09-18  82

细节

1.结构

结构

结构可带有方法、字段、索引、属性、运算符方法和事件。结构可定义构造函数,但不能定义析构函数。但是,只能为结构定义有参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。与类不同,结构不能继承其他的结构或类。结构不能作为其他结构或类的基础结构。结构可实现一个或多个接口。结构成员不能指定为 abstract、virtual 或 protected。使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。如果不使用 New操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

类与结构体的区别:

结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。结构不支持继承。结构不能声明默认的构造函数。结构体中声明的字段无法赋予初值,类可以结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制

类与结构体的应用区别:

当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;对于点、矩形和颜色这样的轻量对象,在这种情况下,使用结构的成本较低;在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。

2.泛型

当代码重复率高,值类型不同时可以用泛型降低代码的重复率。如:

static int Sum(List<int> nums) { int text = 0; foreach (int num in nums) { Console.WriteLine(num); } return sum; } static double Sum(List<double> nums) { double text = 0; foreach (double num in nums) { Console.WriteLine(num); } return text; } //代码是重复的。但是类型不一样所以要声明两次更改写法,使用泛型: static T Sum<T>(List<T> nums) where T:struct { T text = default(T);//T类型的默认值 foreach (var num in nums) { Console.WriteLine(num); } return text; } //where T:结构(类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。) //where T:类(类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。) //where T:new()(类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。) //where T:<基类名>(类型参数必须是指定的基类或派生自指定的基类。) //where T:<接口名称>(类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。) //where T:U(为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。也就是说T和U的参数必须一样)

3.资源清理

继承IDisposable接口,实现Dispose方法; 介绍:调用Dispose方法,销毁对象,需要显示调用或者通过using语句,在显示调用或者离开using程序块时被调用。 Dispose方法用于清理对象封装的非托管资源,而不是释放对象的内存,对象的内存依然由垃圾回收器控制。 Dispose方法调用,不但释放该类的非托管资源,还释放了引用的类的非托管资源。 Dispose模式就是一种强制资源清理所要遵守的约定;Dispose模式实现IDisposable接口,从而使得该类型提供一个公有的Dispose方法。

class Test : IDisposable { public void Dispose() { Console.WriteLine("disposing"); } } static void Main(string[] args) { Console.WriteLine("before dispose"); using (var test = new Test()) { }//方法里为空 Console.WriteLine("after dispose"); Console.Read(); } //结果:before dispose,disposing,after dispose 常用: StreamWriter sw = new StreamWriter(new FileStream("111.txt",FileMode.Create,FileAccess.Write)); sw.WriteLine("123"); sw.Close();//会忘 改为: using (StreamWriter sw = new StreamWriter(new FileStream("111.txt", FileMode.Create, FileAccess.Write))) { sw.WriteLine("123"); }
最新回复(0)