2026-10-18 08:41:59
using关键字
作为指令:用于为命名空间创建别名或导入其他命名空间中的类型,简化代码书写。例如:
using MyAlias = System.IO; // 创建别名using System.Collections; // 导入命名空间作为语句:定义一个作用域,在作用域结束时自动释放对象(需实现IDisposable接口)。例如:
using (var file = new StreamReader("path")) { // 使用file对象} // 自动调用file.Dispose()new关键字
创建实例:用于实例化类或结构体。例如:
var obj = new MyClass();隐藏父类方法:在子类中隐藏父类的同名方法(需配合override或直接隐藏)。例如:
class Parent { public void Foo() {} }class Child : Parent { public new void Foo() {} } // 隐藏父类FooSystem.String
不可变性:字符串一旦创建,内容不可修改。任何修改操作(如拼接)都会生成新对象。
性能问题:频繁拼接(如循环中使用+)会导致大量临时对象生成,增加内存压力。
适用场景:少量字符串操作或无需修改的场景。
System.StringBuilder
可变性:内部维护一个可修改的字符缓冲区,直接操作原内容,不生成新对象。
高性能:适合频繁拼接或修改字符串的场景(如循环中拼接)。
方法支持:提供Append、Insert、Remove等方法直接修改字符串。
适用场景:需要高性能字符串操作的场景(如日志处理、动态文本生成)。
示例对比:
// String拼接(低效)string str = "";for (int i = 0; i < 1000; i++) { str += i.ToString(); // 每次循环生成新对象}// StringBuilder拼接(高效)var sb = new StringBuilder();for (int i = 0; i < 1000; i++) { sb.Append(i.ToString()); // 直接修改缓冲区}string result = sb.ToString();const和readonly的区别const
编译期常量:必须在声明时初始化,且值不可修改。
静态性:隐式为static,无需加static修饰符。
适用类型:仅支持基本类型(如int、string)或枚举。
示例:
const int MaxValue = 100; // 编译期确定值readonly
运行时常量:可在声明时或构造函数中初始化,初始化后不可修改。
非静态性:默认非静态,可为实例字段或静态字段(需显式加static)。
适用类型:支持任意类型(包括引用类型)。
示例:
readonly DateTime CreateTime = DateTime.Now; // 构造函数中初始化public MyClass(DateTime time) { CreateTime = time; // 允许在构造函数中赋值}关键区别:
委托(Delegate)
定义:委托是一种类型安全的函数指针,可将方法作为参数传递。
声明:使用delegate关键字定义签名。例如:
public delegate void MyDelegate(string message);使用:实例化委托并关联方法。例如:
MyDelegate del = Console.WriteLine; // 关联静态方法del("Hello"); // 调用委托事件(Event)
定义:事件是一种特殊的委托,用于封装委托实例,提供更安全的发布-订阅模式。
声明:在类中用event关键字修饰委托类型。例如:
public class Publisher { public event MyDelegate OnMessage; // 声明事件 public void Notify(string message) { OnMessage?.Invoke(message); // 触发事件 }}使用:外部类只能订阅(+=)或取消订阅(-=)事件,不能直接调用。
关键区别:
ArrayList
非泛型集合:存储元素时统一视为object类型,需手动拆装箱。
性能问题:拆装箱操作导致性能损耗,且存在类型安全隐患。
灵活性:可存储任意类型(值类型或引用类型),但需显式类型转换。
示例:
var list = new ArrayList();list.Add(1); // 装箱(int -> object)int num = (int)list[0]; // 拆箱(object -> int)List<T>
泛型集合:编译时确定元素类型,避免拆装箱,性能更高。
类型安全:编译器检查类型,减少运行时错误。
功能丰富:提供Add、Remove、Find等方法,支持LINQ查询。
示例:
var list = new List<int>();list.Add(1); // 直接存储int,无需拆装箱int num = list[0]; // 直接读取int关键区别: