本文共 2906 字,大约阅读时间需要 9 分钟。
在C#中,构造函数是对象创建时自动调用的一系列代码。C#中的数据类型主要分为引用类型和值类型。构造函数又分为实例构造函数和静态构造函数。
引用类型的构造函数是最常见的。以下是一个简单的示例:
class Program { // 无参构造器 public Program() { } // 带参数数组的构造器 public Program(Object[] para) { } // 静态构造器 static Program() { }} 如果一个类中没有定义构造器,编译器会默认生成一个无参的构造器。
值类型(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#不允许在值类型中定义无参构造函数。
析构函数的作用是释放对象占用的资源。C#中析构函数的使用有一些重要注意事项。
GC.Collect()来强制回收。Dispose()方法用于释放托管和非托管资源,需要实现IDisposable接口。Dispose()方法来释放资源,而不是依赖垃圾回收器。IDisposable接口,可以在Dispose()方法中调用GC.SuppressFinalize(this),告诉垃圾回收器不再调用析构函数。class Car { ~Car() { // 资源释放代码 }}class TestDestructors { static void Main() { Car car = new Car(); car = null; GC.Collect(); Console.ReadLine(); }} 输出结果会显示析构函数被调用。
在C#中,可以重载编程语言定义的操作符。操作符重载允许自定义类型的实例如何处理特定操作符。
+, -, !, ~, ++, --, true, false+, -, *, /, %, &, |, ^, <, >, <=, >=, ==, !=, <>, &, |, ^class Complex { public static Complex operator+(Complex c1, Complex c2) { // 运算逻辑 }} 在IL代码中,+ 运算符会转化为 op_Addition 方法。
转化操作符方法用于将一种类型的实例转化为另一种类型。在C#中,转化操作符必须是public和static方法。
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代码中,隐式转化方法会被编译器自动调用。
扩展方法允许在不修改原有代码的情况下扩展类的功能。
static class PrintClass { public static void Print(this Program program, Int32 count) { for (Int32 i = 0; i < count; i++) { Console.WriteLine(i); } }} 扩展方法必须在非泛型的静态类中定义,并且第一个参数必须是this关键字。
分部方法允许将方法的定义和实现分散到多个源文件中。
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。
extern修饰符用于定义外部实现的方法,通常用于与外部库进行交互。
[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/