博客
关于我
【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/

你可能感兴趣的文章
Optional讲解
查看>>
ORA-00932: inconsistent datatypes: expected - got NCLOB【ORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 】【解决办法】
查看>>
ORA-00942 表或视图不存在
查看>>
ORA-01034: ORACLE not available
查看>>
ORA-01152: 文件 1 没有从过旧的备份中还原
查看>>
ORA-01207:文件比控制文件更新 - 旧的控制文件
查看>>
ORA-01795: 列表中的最大表达式数为 1000
查看>>
ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态
查看>>
ORA-08102的错误
查看>>
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor异常
查看>>
ORA-12514: TNS:listener does not currently know of service问题原因
查看>>
ora-12541:tns:no listener
查看>>
【docker知识】联合文件系统(unionFS)原理
查看>>
ORACEL学习--理解over()函数
查看>>
oracle 10g crs命令,Oracle 10g CRS安装问题解决一例
查看>>
Oracle 10g ORA-01034: ORACLE not available 错误
查看>>
oracle 10g的安装配置
查看>>
Oracle 11.2.0.4 x64 RAC修改public/private/vip/scan地址
查看>>
Oracle 11G INDEX FULL SCAN 和 INDEX FAST FULL SCAN 对比分析
查看>>
Oracle 11g UNDO表空间备份增强
查看>>