C#运算符重载与索引器

运算符重载主要是让+-*、等等的运算符有我们自定义的功能。这样就可以让我们的代码变得更加简洁而易于理解

期中索引器使用的运算符是[],所以我把自定义索引器也放到一块来讲

首先来看看MSDN为我们列出的可以重载的运算符吧

 

运算符 可重载性

+、-、!、~、++、--、true 和 false

可以重载这些一元运算符。

+, -, *, /, %, &, |, ^, <<, >>

可以重载这些二进制运算符。

==, !=, <, >, <=, >=

比较运算符可以重载(但请参见本表后面的说明)。

&&, ||

条件逻辑运算符不能重载,但可使用能够重载的 &| 进行计算。

[]

不能重载数组索引运算符,但可定义索引器。

()

不能重载转换运算符,但可定义新的转换运算符(请参见 explicit 和 implicit)。

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

赋值运算符不能重载,但 += 可使用 + 计算,等等。

=、.、?:、->、new、is、sizeof 和 typeof

不能重载这些运算符。

 

我们挑几个来写一写代码

以下的代码是实现一个复数类的部分功能,以及为了展示一些代码我乱添加的一些无意义的功能

 

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Complex { public class Complex { public int real; public int imaginary; public string str; public Complex(int real, int imaginary) { this.real = real; this.imaginary = imaginary; } public static Complex operator ++(Complex c1) { return new Complex(c1.real + 1, c1.imaginary); } public static Complex operator +(Complex c1, Complex c2) { return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); } public static bool operator ==(Complex c1, Complex c2) { return ((c1.real == c2.real) && (c1.imaginary == c2.imaginary)); } public static bool operator !=(Complex c1, Complex c2) { return ((c1.real != c2.real) || (c1.imaginary != c2.imaginary)); } public override string ToString() { return string.Format("{0}+{1}i", real, imaginary); } } public class Complexs { private Complex[] c = new Complex[3]; public Complex this[int i] { get { if (i >= 0 && i <= 2) { return c[i]; } else { return new Complex(0, 0); } } set { c[i] = value; } } public Complexs(Complex c1, Complex c2, Complex c3) { c[0] = c1; c[1] = c2; c[2] = c3; } } class Program { static void Main(string[] args) { Complex c1 = new Complex(1, 2); Complex c2 = new Complex(3, 4); Complex c3 = c1 + c2; Console.WriteLine("{0}",c1 == c2); Console.WriteLine(c3.ToString()); Console.WriteLine((++c3).ToString()); Console.WriteLine(c3.ToString()); Console.WriteLine(c3++.ToString()); Console.WriteLine(c3.ToString()); c3 += c2; Console.WriteLine(c3.ToString()); Complexs cs = new Complexs(c1, c2, c3); Console.WriteLine(cs[2].ToString()); Console.ReadKey(); /* * output * * False * 4+6i * 5+6i * 5+6i * 6+6i * 9+10i * 9+10i */ } } }

关于语法 大致上就是

public static Complex operator +(Complex c1, Complex c2)

注意参数的问题,一目运算符就一个参数,二目运算符就两个参数。正常也是不会犯错的。

 

另外还有一点要特别提一下

比较运算符(如果重载)必须成对重载;也就是说,如果重载 == ,也必须重载 != 。反之亦然,<> 以及 <=>= 同样如此。

如果像上面的代码一样重载了==而没有重载Equals()会丢出一个警告。

 

如果重载了一目++ --这类运算符。出现的那种a++;++a;a++ + ++a;这类的问题和基本类型的情况是一样的。通常也不喜欢写这种骗人的代码。

 

+=,-=,*=,这一类的会因为+ - *被重载而有新的意义。

 

下面是一些索引器的东西

关于索引器,我用很烂的方式构造了一个复述集合来使用索引器。

索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。

语法如下

    public
 类型 this
 [int
 i]
{
get { }
set { }
}

添加索引器后,就可以像数组一样使用下标([]运算符)来访问了。通常对GET 和 SET 模块的设计,能让索引器的功能变得十分强大。

 

相关文章地址:

http://msdn.microsoft.com/zh-cn/library/8edha89s(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/6x16t2tx(v=vs.80).aspx

你可能感兴趣的:(.NET,c,string,class,equals,output)