C编程基础概念与异常处理
立即解锁
发布时间: 2025-08-20 01:13:18 订阅数: 1 


C#面向对象编程与Web服务开发
### C# 编程基础概念与异常处理
#### 1. 枚举(Enumerations)
在编程中,我们常常需要将变量的值设定为几个相关的预定义常量之一。这时,可以创建一个枚举类型来对这些值进行分组。枚举将一组整数值常量与代码中可使用的名称关联起来。
以下是一个创建 `Manager` 枚举类型的示例代码:
```csharp
enum Manager
{
DeptManager,
GeneralManager,
AssistantManager,
}
```
在这个示例中,定义了三个相关的管理常量,分别是 `DeptManager`、`GeneralManager` 和 `AssistantManager`,它们的值依次为 0、1 和 2。
可以声明一个枚举类型的变量,并将其设置为枚举常量之一:
```csharp
Manager managerLevel = Manager.DeptManager;
```
#### 2. 变量作用域(Variable Scope)
变量有两个重要的方面:作用域和生命周期。作用域指的是变量在其他代码中可被访问的范围,而生命周期则是变量有效的时间段。变量的作用域和生命周期由其声明的位置以及声明时使用的访问修饰符决定。
- **块级作用域(Block-Level Scope)**:代码块是一组分组的代码语句,如 `if-else`、`do-loop` 或 `for-next` 语句。块级作用域是变量能拥有的最窄作用域。在代码块内声明的变量仅在该块内可用。
```csharp
if (icount > 10)
{
int blockCount;
blockCount = icount;
}
```
在上述代码中,`blockCount` 变量只能在 `if` 块内部访问,尝试在块外部访问该变量会导致编译器错误。
- **过程作用域(Procedure Scope)**:过程是可以从其他代码调用和执行的代码块。C# 支持两种类型的过程:方法和属性。在代码块外部但在过程内部声明的变量具有过程级作用域。具有过程作用域的变量可以被同一过程内的代码访问。
```csharp
void Counter()
{
int iCount = 0;
do
{
iCount = iCount + 2;
}
while (iCount < 10);
}
```
在上述代码中,`iCount` 变量具有过程作用域,可以在 `Counter` 方法的过程块内的任何位置引用。过程作用域变量的生命周期仅限于过程执行的持续时间。
- **模块作用域(Module Scope)**:具有模块作用域的变量可被类或结构内的任何代码访问。要具有模块作用域,变量需要在类或结构的通用声明部分(任何过程块之外)声明。为了将可访问性限制在声明它的模块内,可以使用 `private` 访问修饰符关键字。
```csharp
public class Class1
{
private int _iCount;
public void IncrementCount()
{
int iCount = 0;
do
{
iCount = iCount + 2;
}
while (iCount < 10);
}
public void ReadCount()
{
Console.WriteLine(_iCount.ToString());
}
}
```
在上述代码中,`_iCount` 变量可以被类中定义的两个过程访问。具有模块作用域的变量的生命周期与声明它的类或结构的对象实例的生命周期相同。
#### 3. 数据类型转换(Data Type Conversion)
在程序执行过程中,很多时候需要将一个值从一种数据类型转换为另一种数据类型。这种在数据类型之间进行转换的过程称为强制类型转换或转换。
- **隐式转换(Implicit Conversion)**:C# 编译器会自动执行一些数据类型转换。对于数值类型,当要存储的值可以在不被截断或舍入的情况下放入变量时,就可以进行隐式转换。
```csharp
int i1 = 373737373;
long l1 = i1;
l1 *= l1;
```
在上述代码中,整数数据类型被隐式转换为长整型数据类型。
- **显式转换(Explicit Conversion)**:显式转换也称为强制类型转换。要执行强制类型转换,需要在要转换的值或变量前面的括号中指定要转换的类型。
```csharp
double n1 = 3.73737373;
int i1 = (int)n1;
```
在上述代码中,使用强制类型转换将双精度浮点型 `n1` 显式转换为整型。
- **扩展和收缩转换(Widening and Narrowing Conversions)**:
- 扩展转换发生在要转换到的数据类型可以容纳原始数据类型中所有可能的值时。例如,整数数据类型可以转换为双精度浮点型数据类型,而不会造成任何数据丢失或溢出。
- 收缩转换则发生在要转换到的数据类型无法容纳原始数据类型中所有可能的值时。例如,将双精度浮点型数据类型的值转换为短整型数据类型时,原始值中包含的任何小数部分都会丢失。此外,如果原始值超过了短整型数据类型的限制,将会发生运行时异常。在代码中实现收缩转换时,需要特别小心处理这些情况。
#### 4. 运算符(Operators)
运算符是告诉编译器对值执行操作的代码符号。操作可以是算术、比较或逻辑操作。
- **算术运算符(Arithmetic Operators)**:算术运算符用于对数值类型进行数学运算。以下是 C# 中常用的算术运算符:
| 运算符 | 描述 |
| --- | --- |
| = | 赋值 |
| * | 乘法 |
| / | 除法 |
| + | 加法 |
| - | 减法 |
```csharp
Count = Count + 1;
```
C# 还支持将赋值与操作结合的简写赋值运算符,例如:
```csharp
Count += 1;
```
如果要将值加 1,还可以使用简写赋值 `++`:
```csharp
Count ++;
```
- **比较运算符(Comparison Operators)**:比较运算符用于比较两个值,并返回布尔值 `true` 或 `false`。以下是 C# 中常用的比较运算符:
| 运算符 | 描述 |
| --- | --- |
| < | 小于 |
| <= | 小于或等于 |
| > | 大于 |
| >= | 大于或等于 |
| == | 等于 |
| != | 不等于 |
```csharp
if (_loginAttempts > 3)
{
Messagebox.Show("Invalid login.");
}
```
在上述代码中,使用比较运算符在条件语句中判断是否显示消息。
- **逻辑运算符(Logical Operators)**:逻辑运算符用于组合条件运算符的结果。最常用的三个逻辑运算符是 AND、OR 和 NOT 运算符。
- AND 运算符(`&&`):组合两个表达式,如果两个表达式都为 `true`,则返回 `true`。
- OR 运算符(`||`):组合两个表达式,如果其中一个表达式为 `true`,则返回 `true`。
- NOT 运算符(`!`):反转比较的结果,`true` 返回 `false`,`false` 返回 `true`。
```csharp
if (currentUserLevel == Manager.AssistantManager ||
currentUserLevel == Manager.DeptManager)
{
ReadLog();
}
```
在上述代码中,使用逻辑运算符判断是否运行 `ReadLog` 方法。
- **三元运算符(Ternary Operator)**:三元运算符计算一个布尔表达式,并根据表达式的结果返回两个值之一。其语法如下:
```csharp
condition ? first_expression : second_expression;
```
如果条件计算结果为 `true`,则返回第一个表达式的结果;如果条件计算结果为 `false`,则返回第二个表达式的结果。
```csharp
return x == 0.0 ? 0 : y/x;
```
在上述代码中,检查 `x` 的值是否为 0,如果是,则返回 0;否则,将 `y` 除以 `x` 并返回结果。
#### 5. 决策结构(Decision Structures)
决策结构允许根据条件语句的计算结果有条件地执行代码块。
- **if 语句(If Statements)**:
- 执行一个代码块,如果条件为 `true`:
```csharp
if (condition1)
{
//code
}
```
- 执行一个代码块,如果条件为 `true`;执行另一个代码块,如果条件为 `false`:
```csharp
if (condition1)
{
//code
}
els
```
0
0
复制全文
相关推荐










