深入探索对象协作、异常处理与集合操作
立即解锁
发布时间: 2025-08-20 01:13:16 订阅数: 1 


C#面向对象编程与Web服务开发
# 深入探索对象协作、异常处理与集合操作
## 1. 异常处理
### 1.1 抛出异常
在代码执行过程中,当出现不恰当的调用时,例如方法的参数值无效或传递的参数导致异常,我们可以抛出异常来通知调用代码出现了违规情况。以下代码展示了如果 `orderDate` 参数大于当前日期,会抛出 `ArgumentOutOfRangeException` 异常:
```csharp
if (orderDate > DateTime.Now)
{
throw new ArgumentOutOfRangeException ("Order date can not be in the future.");
}
//Processing code...
```
若在 .NET 框架中找不到合适的预定义异常类,我们可以创建一个从 `System.Exception` 类派生的自定义异常类。
### 1.2 嵌套异常处理
某些情况下,我们可能能够纠正发生的异常并继续处理 `try` 块中的其余代码。例如,可能会发生除零错误,此时将结果赋值为零并继续处理是可以接受的。在这种情况下,可以在可能引发异常的代码行周围嵌套一个 `try-catch` 块。异常处理后,处理将返回到外部 `try-catch` 块中嵌套 `try` 块之后的代码行。以下代码演示了如何将一个 `try` 块嵌套在另一个 `try` 块中:
```csharp
try
{
try
{
Y = X1 / X2;
}
catch (DivideByZeroException ex)
{
Y = 0;
}
//Rest of processing code.
}
catch (Exception ex)
{
//Outer exception processing
}
```
### 1.3 异常过滤
我们可以根据抛出的不同异常返回不同的消息,示例代码如下:
```csharp
catch (FileNotFoundException ex)
{
return ex.Message;
}
catch (IOException ex)
{
return ex.Message;
}
catch
{
return "Logging Failed";
}
```
## 2. 静态属性和方法
### 2.1 静态属性
当声明类的对象实例时,对象会实例化其实现的类的属性和方法的自己的实例。但有时我们希望类的不同对象实例访问相同的共享变量。例如,我们可能想创建一个计数器来记录类的对象实例被实例化的次数。以下代码展示了如何在类定义中创建一个静态 `TaxRate` 属性:
```csharp
public class AccountingUtilities
{
private static double _taxRate = 0.06;
public static double TaxRate
{
get { return _taxRate; }
}
}
```
要访问静态属性,无需创建类的对象实例,而是直接引用类。以下代码展示了客户端如何访问前面定义的静态 `TaxRate` 属性:
```csharp
public class Purchase
{
public double CalculateTax(double purchasePrice)
{
return purchasePrice * AccountingUtilities.TaxRate;
}
}
```
### 2.2 静态方法
静态方法在客户端需要访问实用函数,但又不想为访问方法而创建类的对象实例的开销时非常有用。需要注意的是,静态方法只能访问静态属性。以下代码展示了一个用于统计当前登录到应用程序的用户数量的静态方法:
```csharp
public class UserLog
{
private static int _userCount;
public static void IncrementUserCount()
{
_userCount += 1;
}
public static void DecrementUserCount()
{
_userCount -= 1;
}
}
```
客户端代码通过直接引用类来访问静态方法。以下代码演示了如何访问前面定义的静态方法:
```csharp
public class User
{
//other code ...
public void Login(string userName, string password)
{
//code to check credentials
//if successful
UserLog.IncrementUserCount();
}
}
```
## 3. 活动:实现异常处理和静态方法
### 3.1 创建静态方法
创建静态方法的步骤如下:
1. 启动 Visual Studio,选择 `File ➤ New ➤ Project`。
2. 选择 Windows 应用程序项目,将项目命名为 `Activity8_2`。
3. Visual Studio 会为项目创建一个默认窗体,我们将使用它来创建一个名为 `Logger` 的登录窗体。添加控件并更改属性值,如下表所示:
| Object | Property | Value |
| ---- | ---- | ---- |
| Form1 | Name | frmLogger |
| | Text | Logger |
| Textbox1 | Name | txtLogPath |
| | Text | c:\Test\LogTest.txt |
| Textbox2 | Name | txtLogInfo |
| | Text | Test Message |
| Button1 | Name | btnL ogInfo |
| | Text | Log Info |
4. 选择 `Project ➤ Add Class`,将类命名为 `Logger`。
5. 由于在 `Logger` 类中会使用 `System.IO` 类,在类文件顶部添加 `using` 语句:
```csharp
using System.IO;
```
6. 向类中添加一个静态 `LogWrite` 方法,该方法将信息写入日志文件。为打开文件,创建一个 `FileStream` 对象,然后创建一个 `StreamWriter` 对象来将信息写入文件。注意使用 `using` 块来正确处理 `FileStream` 和 `StreamWriter` 对象并释放资源:
```csharp
public static string LogWrite(string logPath, string logInfo)
{
using (FileStream oFileStream = new FileStream(logPath, FileMode.Open, FileAccess.Write))
{
using (StreamWriter oStreamWriter = new StreamWriter(oFileStream))
{
oFileStream.Seek(0, SeekOrigin.End);
oStreamWriter.WriteLine(DateTime.Now);
oStreamWriter.WriteLine(logInfo);
oStreamWriter.WriteLine();
}
}
return "Info Logged";
}
```
7. 在可视化设计编辑器中打开 `frmLogger`,双击 `btnLogInfo` 按钮,在代码编辑器中调出 `btnLogInfo_Click` 事件方法。添加以下代码,该代码运行 `Logger` 类的 `LogWrite` 方法并将结果显示在窗体的文本属性中:
```csharp
private void btnLogInfo_Click(object sender, EventArgs e)
{
this.Text = Logger.LogWrite(txtLogPath.Text, txtLogInfo.Text);
}
```
8. 选择 `Build ➤ Build Solution`,确保错误列表窗口中没有构建错误。如果有,修复它们并重新构建。
9. 选择 `Debug ➤ Run`,当窗体启动时,点击 `Log Info` 按钮,应该会得到一个未处理的 `System.IO.DirectoryNotFoundException` 类型的异常消息,停止调试器。
### 3.2 创建结构化异常处理程序
创建结构化异常处理程序的步骤如下:
1. 在代码编辑器中打开 `Logger` 类代码。
2. 找到 `LogWrite` 方法,在当前代码周围添加一个 `try-catch` 块。在 `catch` 块中,返回一个表示日志记录失败的字符串:
```csharp
try
{
using (FileStream oFileStream = new FileStream(logPath, FileMode.Open, FileAccess.Write))
{
using (StreamWriter oStreamWriter = new StreamWriter(oFileStream))
{
oFileStream.Seek(0, SeekOrigin.End);
oStreamWriter.WriteLine(DateTim
```
0
0
复制全文
相关推荐










