正如程序所演示的,我们现在可以很直观地对属于复杂类的对象使用加减运算符。下面是我们得到的输出:
Complex Number A: 10.5 12.5i Complex Number B: 8 4.5i A B = 18.5 17i A - B = 2.5 8i
虽然 Java 在内部为字符串连接重载了 运算符,但是它并不支持运算符重载。
异常
C# 中的异常处理与 Java 非常相似。
在程序执行的过程中,无论什么时候出现了严重错误,.NET 运行库都会创建一个 Exception 对象来处理该错误。在 .NET 中,Exception 是所有异常类的基类。从 Exception 基类派生了两种类别的异常:System.SystemException 和 System.ApplicationException。System 命名空间中的所有类型都是从 System.SystemException 派生的,而用户定义的异常应该从 System.ApplicationException 派生,以便区分运行库错误和应用程序错误。一些常见的 System 异常包括:
•IndexOutOfRangeException — 使用了大于数组或集合大小的索引
•NullReferenceException — 在将引用设置为有效的实例之前使用了引用的属性或方法
•ArithmeticException — 在操作产生溢出或下溢时引发的异常
•FormatException — 参数或操作数的格式不正确
与 Java 中一样,当我们有容易引起异常的代码时,我们应该将此代码放在 try 块中。紧接其后的是一个或多个提供错误处理的 catch 块,并且我们还可以对任何我们想执行但又不知道是否引发异常的代码使用 finally 块。
注意:当使用多个 catch 块时,捕获异常的代码必须以升序的顺序放置,这样就只有第一个与引发的异常相匹配的 catch 块会被执行。C# 编译器会强制这样做,而 Java 编译器不会这样做。
C# 也与 Java 一样,catch 块并不需要参数;在缺少参数的情况下,catch 块适用于任何 Exception 类。
例如,当从文件中进行读取时,可能会遇到 FileNotFoundException 或 IOException,首先,我们需要放置更具体的 FileNotFoundException 处理程序:
try
{
// Code to open and read a file
}
catch (FileNotFoundException fe)
{
// Handle file not found exception first
}
catch (IOException ioe)
{
// Now handle any other IO exceptions
}
catch
{
// This block will catch all other exceptions
}
finally
{
// Executed whether or not an exception occurs, often to release resources
}
通过从 Exception 派生,我们可以创建我们自己的异常类。例如,下面的代码创建了一个 InvalidDepartmentException 类,比方说,当某个部门的一个新雇员记录为无效时,我们可能引发该类。用户定义的异常的类构造函数使用 base 关键字来调用基类构造函数,并发送一个适当的消息:
public class InvalidDepartmentException : System.Exception
{
public InvalidDepartmentException(string Department) : base(
"Invalid Department: " Department){ }
}
那么,我们可以用下面的代码引发这种类型的异常:
if (!(Department == "Sales" | Department == "Marketing"))
{
throw new InvalidDepartmentException(Department);
}
注意,C# 不支持 checked 异常。在 Java 中,这些是使用 throws 关键字进行声明的,以便指定一个方法可能引发一个特殊类型的异常,此异常必须由调用代码进行处理。有关 C# 为什么不支持 checked 异常的更多信息,请参见 interview with Anders Hejlsberg。
高级 C# 技术
索引器
索引器提供了一种以与数组相同的方式访问类或结构的方法。例如,我们可能有表示我们公司内某个部门的类。这个类可以包含该部门中所有雇员的名字,而索引器可以允许我们访问这些名字,如下所示:
myDepartment[0] = "Fred"; myDepartment[1] = "Barney";
等等。在类的定义中,通过定义具有如下签名的属性,可以启用索引器:
public type this [int index]
然后,我们提供 get 和 set 方法作为标准属性,而当使用索引器时,这些访问器指定哪些内部成员被引用。
在下面的简单示例中,我们创建了一个名为 Department 的类,此类使用索引器来访问该部门的雇员(在内部表示为一个字符串数组):
using System;
public class Department
{
private string name;
private const int MAX_EMPLOYEES = 10;
private string [] employees = new string [MAX_EMPLOYEES];
public Department(string deptName)
{
name = deptName;
}
public string this [int index]
{
get
{
if (index >= 0 && index < MAX_EMPLOYEES)
{
return employees[index];
}
else
{
throw new IndexOutOfRangeException();
//return "Error";
}
}
set
{
if (index >= 0 && index < MAX_EMPLOYEES)
{
employees[index] = value;
}
else
{
throw new IndexOutOfRangeException();
//return "Error";
}
}
}
// Other methods and properties as usual
}
然后,我们可以创建这个类的一个实例,并且对其进行访问,如下所示:
using System;
public class SalesDept
{
public static void Main(string[] args)
{
Department sales = new Department("Sales");
sales[0] = "Nikki";
sales[1] = "Becky";
Console.WriteLine("The sales team is {0} and {1}", sales[0],
sales[1]);
}
}
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




