根据给定的信息,我们可以从这些面试题中提炼出若干重要的.NET相关知识点,下面将逐一进行详细解释。
### 1. 访问修饰符
- **Private:** 私有访问修饰符仅允许在定义它的类内部访问该成员。
- **Protected:** 受保护访问修饰符允许在定义它的类及其派生类中访问该成员。
- **Public:** 公共访问修饰符允许从任何地方访问该成员。
- **Internal:** 内部访问修饰符只允许在同一程序集(assembly)内访问该成员。
### 2. ASP.NET 页面之间的值传递方式
页面之间传递数据的方式主要有以下几种:
- **URL Query String:** 通过URL参数传递数据,例如:`http://example.com/?id=1`。
- **Session:** 使用Session对象存储临时数据,可以在整个应用程序会话期间保持数据。
- **Server.Transfer:** 使用此方法可以将请求重定向到同一服务器上的另一个页面,但不会发送新的HTTP请求,因此可以更高效地传递数据。
### 3. 斐波那契数列的实现
```csharp
public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if (i > 0 && i <= 2)
return 1;
else
return Foo(i - 1) + Foo(i - 2);
}
}
```
这段代码实现了一个递归版本的斐波那契数列计算,其中`Foo`函数接受一个整数参数`i`并返回第`i`个斐波那契数。
### 4. C#中的值类型与引用类型
- **值类型**(如`int`, `float`, `struct`等)存储的是实际的数据值,它们直接保存在栈或堆上,具体取决于它们的大小。
- **引用类型**(如`class`, `interface`, `delegate`等)存储的是指向实际数据的引用,数据本身通常位于托管堆上。
### 5. Override与重写
`override`关键字用于重写基类中的虚方法。当子类重写父类的方法时,它必须使用`override`关键字,并且被重写的方法必须具有相同的签名(包括名称、参数列表和返回类型)。这使得子类可以提供对父类方法的不同实现。
### 6. B/S架构系统中Session、Cookie、Application的作用及区别
- **Session:** 用于跨页面维护用户会话状态,通常存储特定于用户的临时数据。
- **Cookie:** 存储在客户端浏览器的小文本文件中,用于识别用户并存储用户偏好设置等。
- **Application:** 应用程序范围内的共享变量,所有用户都可以访问同一个应用程序中的Application变量。
### 7. 清空页面中的TextBox控件值
```csharp
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control;
tb.Text = string.Empty;
}
}
```
这段代码遍历当前窗体的所有控件,如果控件是`TextBox`,则将其文本清空。
### 8. 数组排序算法
```csharp
int[] array = new int[] { /* 初始化数组 */ };
int temp = 0;
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j] < array[i])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
```
这是一个简单的冒泡排序算法,它通过比较相邻元素并交换它们的位置来对数组进行排序。
### 9. C#中是否只能声明一个析构函数
C#中的类只能有一个析构函数,用于执行清理操作,如释放未托管资源。析构函数没有参数,不能被显式调用,由垃圾回收器自动调用。
### 10. 读取字符串并计算奇数之和
```csharp
string numStr = this.TextBox1.Text;
int sum = 0;
for (int i = 0; i < numStr.Length; i++)
{
int currentDigit = int.Parse(numStr[i].ToString());
if ((currentDigit % 2) == 1)
{
sum += currentDigit;
}
else
{
sum -= currentDigit;
}
}
```
此段代码从文本框中读取一个字符串,然后计算字符串中奇数位数字的和与偶数位数字的差值。
### 11. .NET B/S架构系统的各层关系及优缺点
B/S架构通常分为表示层、业务逻辑层和数据访问层:
- **表示层:** 负责用户界面和用户交互。
- **业务逻辑层:** 处理业务规则和流程。
- **数据访问层:** 负责与数据库交互。
优点:
- 易于部署和维护。
- 能够支持大量并发用户。
缺点:
- 性能可能受限于网络带宽。
- 安全性较弱,因为数据在网络上传输。
### 12. 类构造函数和成员变量初始化
```csharp
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
```
创建`B`类的实例时,`x`和`y`的值分别是1和-1。构造函数`B()`先于`A()`执行,并且`B`重写了`PrintFields`方法来显示`x`和`y`的值。
### 13. 应用程序域的作用
应用程序域(AppDomain)是一种轻量级的隔离机制,用于在进程内加载不同的程序集,并为每个程序集提供隔离的运行环境。
### 14. CTS、CLS、CLR的区别
- **CTS (Common Type System):** 公共类型系统,定义了.NET框架中所有类型的基本结构和行为。
- **CLS (Common Language Specification):** 公共语言规范,定义了一组标准类型和语言特性,确保不同语言编写的代码可以互操作。
- **CLR (Common Language Runtime):** 公共语言运行库,提供了执行环境和支持服务,如垃圾回收、内存管理、线程管理和安全控制等。
### 15. 值类型与引用类型的装箱与拆箱
- **装箱:** 将值类型转换为引用类型的过程。
- **拆箱:** 将引用类型的值转换回原始值类型的过程。
### 16. unsafe 关键字的意义
`unsafe`关键字用于指定不安全代码块,允许使用指针和其他不安全的操作。在.NET中,由于CLR的安全性限制,通常禁止使用指针操作。
### 17. 强类型系统
强类型系统是指编译器能够强制类型检查的系统,在编译时期就能发现大多数类型错误。
### 18. .NET中数据访问的主要组成部分
- **DataSet:** 用于在内存中缓存数据库数据。
- **DataCommand:** 用于执行SQL命令。
- **DataAdapter:** 用于填充DataSet或更新数据库。
### 19. ASP.NET认证方式
ASP.NET支持多种认证方式:
- **Windows Authentication:** 默认使用的Windows集成身份验证。
- **Forms Authentication:** 使用自定义表单的身份验证。
- **Passport Authentication:** 已不再推荐使用的认证方式。
### 20. Code-Behind的概念
Code-Behind是一种将用户界面逻辑与业务逻辑分离的技术,通常用于Web应用程序开发中,使代码更易于维护。
### 21. .NET的运行时环境
.NET运行时环境包括CLR(公共语言运行库),负责执行托管代码并提供各种服务,如内存管理、垃圾回收等。
### 22. 消费Web Service的方法
- **使用WSDL.exe工具:** 生成代理类以与Web Service通信。
- **使用Visual Studio的Add Web Reference功能:** 自动生成代理类以简化调用过程。
### 23. .NET Remoting的工作原理
.NET Remoting是一种远程通信技术,允许两个应用程序通过网络相互通信。它使用透明代理和通道来实现。
### 24. C#中string的null与空字符串的区别
- **string str = null:** 表示`str`变量未指向任何字符串对象。
- **string str = "" or string str = string.Empty:** 表示`str`变量指向一个空字符串对象。
### 25. C#中的类(class)与结构体(struct)的区别
- **类:** 是引用类型,存储在托管堆上,可以为空。
- **结构体:** 是值类型,直接存储在栈或堆上,不可以为空。