博客
关于我
【C#】C#中方法(函数)的类型有哪些
阅读量:399 次
发布时间:2019-03-05

本文共 2842 字,大约阅读时间需要 9 分钟。

C#编程入门:构造函数、析构函数与其他重要概念

1. 构造函数

在C#中,构造函数是对象创建时自动调用的一系列代码。C#中的数据类型主要分为引用类型和值类型。构造函数又分为实例构造函数和静态构造函数。

1.1 引用类型的构造函数

引用类型的构造函数是最常见的。以下是一个简单的示例:

class Program {    // 无参构造器    public Program() {    }    // 带参数数组的构造器    public Program(Object[] para) {    }    // 静态构造器    static Program() {    }}

如果一个类中没有定义构造器,编译器会默认生成一个无参的构造器。

1.2 值类型的构造函数

值类型(Struct)的构造函数与引用类型不同。值类型的构造函数必须显示调用,且不能定义无参构造函数。以下是一个示例:

struct Point {    public Int32 m_x, m_y;    public Point() {        m_x = m_y = 5;    }}class Rectangle {    public Point m_topLeft, m_bottomRight;    public Rectangle() {    }}

在上述代码中,m_xm_y 的值不会被初始化为5或0,编译器会报错。这是因为C#不允许在值类型中定义无参构造函数。


2. 析构函数

析构函数的作用是释放对象占用的资源。C#中析构函数的使用有一些重要注意事项。

2.1 析构函数的使用

  • 析构函数不能在结构中定义,只能在类中使用。
  • 每个类只能有一个析构函数。
  • 析构函数无法继承或重载。
  • 析构函数没有参数,且不应为空。
  • 析构函数通常由垃圾回收器自动调用,但也可以通过显式调用GC.Collect()来强制回收。

2.2 析构函数与Dispose()方法的区别

  • Dispose()方法用于释放托管和非托管资源,需要实现IDisposable接口。
  • 析构函数主要用于释放非托管资源,但在某些情况下也可以释放托管资源。
  • 最好通过显式调用Dispose()方法来释放资源,而不是依赖垃圾回收器。
  • 如果类实现了IDisposable接口,可以在Dispose()方法中调用GC.SuppressFinalize(this),告诉垃圾回收器不再调用析构函数。

2.3 示例

class Car {    ~Car() {        // 资源释放代码    }}class TestDestructors {    static void Main() {        Car car = new Car();        car = null;        GC.Collect();        Console.ReadLine();    }}

输出结果会显示析构函数被调用。


3. 操作符重载

在C#中,可以重载编程语言定义的操作符。操作符重载允许自定义类型的实例如何处理特定操作符。

3.1 一元操作符

  • +, -, !, ~, ++, --, true, false

3.2 二元操作符

  • +, -, *, /, %, &, |, ^, <, >, <=, >=, ==, !=, <>, &, |, ^

3.3 示例

class Complex {    public static Complex operator+(Complex c1, Complex c2) {        // 运算逻辑    }}

在IL代码中,+ 运算符会转化为 op_Addition 方法。


4. 转化操作符方法

转化操作符方法用于将一种类型的实例转化为另一种类型。在C#中,转化操作符必须是publicstatic方法。

4.1 示例

public sealed class Rational {    private Int32 num;    public Rational(Int32 num) {        this.num = num;    }    public static implicit operator Rational(Int32 i) {        return new Rational(i);    }    public static explicit operator Int32(Rational r) {        return r.num;    }}

在IL代码中,隐式转化方法会被编译器自动调用。


5. 扩展方法

扩展方法允许在不修改原有代码的情况下扩展类的功能。

5.1 示例

static class PrintClass {    public static void Print(this Program program, Int32 count) {        for (Int32 i = 0; i < count; i++) {            Console.WriteLine(i);        }    }}

扩展方法必须在非泛型的静态类中定义,并且第一个参数必须是this关键字。


6. 分部方法(Partial Methods)

分部方法允许将方法的定义和实现分散到多个源文件中。

6.1 示例

internal sealed partial class Base {    private String m_name;    partial void OnNameChanging(String value);}internal sealed partial class Base {    partial void OnNameChanging(String value) {        if (String.IsNullOrEmpty(value)) {            throw new ArgumentException("value");        }    }}

分部方法的实现必须与声明保持一致,且返回类型始终是void


7. 外部方法(Extern)

extern修饰符用于定义外部实现的方法,通常用于与外部库进行交互。

7.1 示例

[DllImport("User32.dll", EntryPoint = "MessageBox", CharSet = CharSet.Unicode)]public static extern int MyMessageBox(int h, string m, string c, int type);

在上述代码中,DllImport属性用于导入外部库中的方法,EntryPoint指定要调用的方法名称。

转载地址:http://behzz.baihongyu.com/

你可能感兴趣的文章
OJ中常见的一种presentation error解决方法
查看>>
OK335xS UART device registe hacking
查看>>
ok6410内存初始化
查看>>
OkDeepLink 使用教程
查看>>
OKHTTP
查看>>
Okhttp3添加拦截器后,报错,java.io.IOException: unexpected end of stream on okhttp3.Address
查看>>
Okhttp拦截器
查看>>
OkHttp源码解析(构建者模式、责任链模式、主线流程)
查看>>
OkHttp透明压缩,收获性能10倍,外加故障一枚
查看>>
OKR为什么到今天才突然火了?
查看>>
ol3 Demo2 ----地图搜索功能
查看>>
OLAP、OLTP的介绍和比较
查看>>
OLAP在大数据时代的挑战
查看>>
oldboy.16课
查看>>
OLEDB IMEX行数限制的问题
查看>>
ollama 如何删除本地模型文件?
查看>>
ollama-python-Python快速部署Llama 3等大型语言模型最简单方法
查看>>
Ollama怎么启动.gguf 大模型
查看>>
ollama本地部署DeepSeek(Window图文说明)
查看>>
ollama运行多模态模型如何进行api测试?
查看>>