上文数据结构与算法 --- 递归(一) 讲述了什么是递归算法,如何编写递归算法及如何写好递归算法,本文着重讲述一下如何避免递归过深导致的堆栈溢出问题。
递归(Recursion) 是一种解决问题的方法,它将问题分解为更小的子问题,并逐层解决这些子问题。递归算法的核心思想是:一个函数可以直接或间接地调用自身。通过这种自我调用,我们可以用简洁的代码来解决复杂问题。
现在模拟一个异步方法抛出了异常:
csharppublic static async Task ThrowAfter(int ms, string message)
{
await Task.Delay(ms);
throw new Exception(message);
}
思考一下, DontHandle()
方法是否能够捕获到异常?
csharppublic static void DontHandle()
{
try
{
ThrowAfter(1000, "first");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
在实际开发场景中,当ViewModel内的一个属性是一个 ObservableCollection<T>
或者是一个多层级 class
的时候,有可能有的需求需要 ObservableCollection<T>
内的元素的子属性或多层级 class
的子属性,甚至子属性的子属性,变化,需要通知到ViewModel,该怎么做呢?
CAS(Compare And Swap) 是一种无锁算法的实现手段,中文名称为比较并交换。它由 CPU 的原子指令实现,可以在多线程环境下实现无锁的数据结构。