C#复习之struct, Indexer 和运算符的重载

2021-12-05
1 min read
Featured Image

结构 Stuct

结构是值类型. 值类型在内存的栈区(stack), 引用类型在内存的堆区(heep).

用的相对少了, 只有在考虑速度的时候才会去用.

结构和类的对比:

  1. 结构不能定义无参构造函数
  2. 结构不能用 null 赋值
  3. 结构没有继承
    • 结构不能定义成抽象
  4. 结构没有析构函数
  5. 结构字段不能在定义中初始化, 只能在构造函数中.

运算符重载

实现对运算符 (+ , - , *….) 的重新定义.

注意: 必须为共有静态.

public static int operator + (Car c1, Car c2)
{
  return c1.Price + c2.Price;
}

索引器 Indexer

一种特殊的属性. 名称是固定的 this.

作用: 把对象当做数组来使用.

class Student {
   int id;
  public Student(int id) {
    this id = id;
  }
}

class Class : IEnumerable {
  Student students[];
  public Class(int n)
  {
    sudents = new Student[n];
  }
  // 实现接口中的所有方法, 此接口只有一个 GetIEnumerator 方法
  public IEnumerator GetEnumerator()
  {
    //迭代 返回 IEnumerator
    for(int = 0; i < this.students.Length; i++) 
    {
      yield return students[i];
    }
  }
  // 索引器: 特殊的属性, 需要有 get 和 set 两个访问器
  public Student this[ int i ]
  {
    get
    {
      return this.students[i];
    }
    set
    {
      this.student[i] = value;
    }
  }
  
  class Program 
  {
    staic void Main(string[] args)
    {
      Student s1 = new Student(100);
      Student s2 = new Student(101);
      Student s3 = new Student(102);
			Class c1 = new Class(5);
      // 实际保存在班级的数组中, 是一个伪数组, 不能用数组的方法. 因为没有实现 IEnumerable 这个接口
      // 所以可以单独调用这个接口来实现迭代器.
      c1[0] = s1;
      c1[1] = s2;
      c1[2] = s3;
    }
  }
}
Avatar
Aaron Fan My research interests include machine learning, signal processing, web development and robotics.