博客
关于我
【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_x 和 m_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#中,转化操作符必须是public和static方法。

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/

你可能感兴趣的文章
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>
python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
查看>>
python列表前几个_python之列表
查看>>
python列表元组
查看>>
Python列表/元组/字典和集合使用
查看>>
python列表 行列选择_python_pandas_dataframe_行列选择_切片操作
查看>>
python列表
查看>>
python列出当前目录、子目录和文件的脚本
查看>>
python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
查看>>