适合每位开发人员的 60 个 C# 代码片段( 六 )


用例:
当您需要互相分配代表时
创建更灵活且可重用的委托代码
6. 匿名代表Func<int, int> square = delegate(int x) { return x * x; };您可以匿名定义委托,而无需声明单独的方法 。这就像创建一家快闪店而不是一家永久性商店!
用例:
当您想内联定义委托时
让委托代码靠近使用它的地方
7. 异步委托Func<int, int> slowFunc = x => { Thread.Sleep(1000); return x * x; };IAsyncResult asyncResult = slowFunc.BeginInvoke(5, null, null);// Do other work...int result = slowFunc.EndInvoke(asyncResult);// Waits for the result您可以使用 BeginInvoke 和 EndInvoke 方法异步执行委托 。这就像写信而不是打电话一样!
用例:
当您需要执行长时间运行的操作时
让您的 UI 保持响应能力
8. 委托作为实例变量class MyClass{private Func<int, int> _myFunc = x => x * x;public void SetFunc(Func<int, int> func){_myFunc = func;}public int Compute(int x){return _myFunc(x);}}您可以使用委托作为实例变量来创建高度可定制的类 。这就像在汽车行驶时更换发动机一样!
用例:
当您需要自定义类的行为时
创建灵活且可扩展的类
9.EventHandler<T>委托public class MyClass{public event EventHandler<string> MyEvent;protected virtual void OnMyEvent(string value){MyEvent?.Invoke(this, value);}}EventHandler<T> 委托提供了声明事件的标准方法 。这就像在活动中普遍接受的握手!
用例:
当你需要声明一个事件时
确保您的事件与 .NET 约定兼容
10. 代表表达Func<int, bool> isEven = x => x % 2 == 0;List<int> numbers = Enumerable.Range(0, 10).ToList();List<int> evenNumbers = numbers.Where(isEven).ToList();委托是封装表达式并传递它们的好方法 。这就像在你的口袋里携带一个便携式数学方程!
用例:
当您需要传递复杂的表达式时
让您的代码更具表现力和灵活性
10 个异常处理片段1. Try-Catch-Finally 语句try{// Potentially dangerous code here...}catch (SpecificException ex){// Handle a specific exception}catch{// Handle any other exceptions}finally{// Cleanup code that always executes}经典的 try-catch-finally 语句 。它就像一张安全网,可以防止任何意外的空中飞人跌倒!
用例:
执行可能抛出异常的代码时
确保清理代码始终运行
2. 抛出新的异常catch (Exception ex){throw new MyException("Something bad happened", ex);}使用附加信息重新引发异常 。这就像退回有缺陷的产品,但附有投诉信!
用例:
当您需要向异常添加附加信息时
创建详细的异常历史记录
3. 过滤异常catch (Exception ex) when (ex.Message.Contains("specific")){// Handle the exception}根据条件过滤异常 。它就像一个例外的保镖,只允许某些人进入!
用例:
当你只想处理某些异常时
创建更具可读性和更高效的异常处理代码
4. 内部异常catch (Exception ex){Console.WriteLine(ex.InnerException);}访问异常的内部异常 。就像剥洋葱,露出它的层一样!
用例:
当您需要发现异常的根本原因时
显示或记录更详细的异常信息
5. 聚合异常try{// Parallel or async code that throws multiple exceptions...}catch (AggregateException ae){ae.Handle(ex =>{// Handle each exceptionreturn true;});}处理从并行或异步代码引发的多个异常 。就像一张网捕捉一群蜜蜂一样!
用例:
执行可能引发多个异常的并行或异步代码时
单独处理每个异常
6. 非捕获异常处理程序try{// Dangerous code...}catch (Exception ex) when (LogException(ex)){}bool LogException(Exception ex){// Log the exception and return falsereturn false;}记录异常而不捕获它们 。就像闭路电视摄像机观察一切但不干预!
用例:
当您需要记录异常但允许它们传播时
监视代码中的异常
7.ExceptionDispatchInfo类ExceptionDispatchInfo capturedException;try{// Dangerous code...}catch (Exception ex){capturedException = ExceptionDispatchInfo.Capture(ex);}// Later...capturedException?.Throw();捕获并重新抛出异常,同时保留原始堆栈跟踪 。这就像一个例外的时间胶囊!
用例:
当您需要跨线程或异步方法抛出异常时
保留异常的原始堆栈跟踪
8. 自定义例外public class MyException : Exception{public MyException(string message) : base(message) { }public MyException(string message, Exception inner) : base(message, inner) { }}


推荐阅读