目录
ps: 用 # 是为了提亮注释颜色,应用 //
using
结构
在 C# 中,using
结构用于确保在代码块结束时释放资源。它主要用于处理实现了 IDisposable
接口的资源(IDisposable
接口只包含一个名为 Dispose()
的方法),这些资源需要在使用完毕后显式释放,以便及时回收内存和清理资源。
using
结构的语法如下:
using (ResourceType resource = new ResourceType())
{
# 使用 resource 对象进行一些操作
# 这个代码块结束后,resource 对象会被自动释放(调用 Dispose 方法)
}
ResourceType
是需要释放资源的类型,它实现了 IDisposable
接口。
在 using
结构内部,我们创建了一个 resource
对象,然后在代码块内对其进行一些操作。当代码块结束时,无论是正常执行还是发生异常,using
结构会自动调用 resource.Dispose()
方法来释放资源。
例子:
using (StreamReader reader = new StreamReader(filePath))
{
string content = reader.ReadToEnd();
Console.WriteLine("文件内容:");
Console.WriteLine(content);
}
# 在此处,using 结构结束,reader 对象会被自动释放(调用 Dispose 方法)
用 using
结构来创建一个 StreamReader
对象来读取文件 "example.txt" 的内容。无论读取文件是否成功,当代码块结束时,StreamReader
对象都会被自动释放,这样可以确保文件资源得到正确释放。
ps:using
结构仅在使用需要显式释放资源的情况下才使用。对于不需要显式释放资源的对象,C# 的垃圾回收机制会自动进行内存管理。
显式释放资源
需要显式释放资源的情况通常涉及与外部系统进行交互的资源,如文件、数据库连接、网络连接、图形界面资源等。这些资源的创建和管理可能涉及非托管资源(由操作系统或外部库分配的资源),在使用完毕后,需要显式释放资源以确保资源的正确释放和回收。
以下是一些需要显式释放资源的情况:
-
文件操作:在读写文件时,使用
FileStream
或StreamReader/StreamWriter
等文件操作类。在完成文件操作后,需要使用using
结构或手动调用Dispose
方法来释放相关资源。 -
数据库连接:使用
SqlConnection
、MySqlConnection
或其他数据库连接类进行数据库操作。在使用完毕后,必须显式关闭数据库连接并释放资源,以避免数据库连接池溢出或资源泄漏。 -
网络连接:在与网络资源进行交互时,使用
HttpClient
、TcpClient
等网络连接类。在完成网络操作后,需要释放网络连接资源。 -
图形界面资源:在使用图形界面库如 Windows Forms 或 WPF 创建界面时,涉及到窗口、图形对象、绘图上下文等资源。在关闭窗口或界面时,需要显式释放这些资源。
-
外部系统调用:在与外部系统进行交互或调用外部库时,可能涉及到资源的分配和管理。在完成操作后,需要适时释放这些资源。
而对于一些托管资源,由于 C# 的垃圾回收机制,它们不需要显式释放资源。以下是一些不需要显式释放资源的对象:
-
纯托管对象:只包含托管代码的类实例,例如自定义的数据结构、简单的数据类型和变量等。
-
字符串:C# 中的字符串类型(
string
)由 CLR 自动管理其内存。 -
集合类:例如
List<T>
、Dictionary<TKey, TValue>
等,当不再使用时,它们的内存会被自动回收。 -
自动分配的局部变量:方法内部声明的局部变量,当超出作用域后会被自动回收。
总之,对于托管资源,C# 的垃圾回收机制会自动管理内存和资源的释放,而对于涉及非托管资源的情况,需要显式释放资源,以确保资源的正确回收和释放。在这些情况下,使用 using
结构或手动调用 Dispose
方法是一种良好的实践。
方法定义:
在C#中,方法的定义通常遵循一定的格式。方法的格式包括以下主要部分:
-
访问修饰符(Access Modifier): 定义方法的可访问性,例如
public
、private
、protected
等。它决定了方法是否可以从其他类中访问。 -
修饰符(Modifiers): 包括其他修饰符,例如
static
(静态方法)、virtual
(虚方法)、override
(覆盖基类方法)等。 -
返回类型(Return Type): 指定方法的返回值类型。如果方法不返回任何值,则使用
void
。 -
方法名(Method Name): 方法的名称,用于标识方法。
-
参数列表(Parameter List): 方法接受的输入参数列表,如果没有参数,则为空括号。
-
方法体(Method Body): 包含在花括号
{}
中的语句块,包括方法的实际逻辑。
例:public static Car CarCreate(string car)
- 访问修饰符是
public
,表示该方法可以从其他类中访问。 - 修饰符是
static
,表示这是一个静态方法。 - 返回类型是
Car
,表示该方法将返回一个Car
类型的对象。 - 方法名是
CarCreate
。 - 参数列表包含一个参数
string car
,表示输入的汽车类型。 - 方法体包含了实际的逻辑,根据输入参数创建不同类型的汽车对象。
根据具体的需求和场景,方法的格式可能会有所不同。例如,是否有返回值、是否有参数等都会影响方法的格式。
父类子类抽象类:子类不用重新创建在父类已经定义的非抽象方法