续上面

4.扩展方法
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型或修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。例如,我们可以让Random类的所有实例对象拥有一个返回随机bool值的方法。我们不能对Random类本身进行修改,但可以对它进行扩展,如下代码所示:

staticclass Program {
///<summary>
/// 随机返回 true 或 false
///</summary>
///<param name="random">this参数自动指定到Random的实例</param>
///<returns></returns>
publicstaticbool NextBool(this Random random) {
return random.NextDouble() >0.5;
    }

staticvoid Main(string[] args) {
//调用扩展方法
        Random rd = new Random();
bool bl = rd.NextBool();

        Console.WriteLine(bl.ToString());
        Console.ReadKey();
    }
}

注意,扩展方法必须在非泛型的静态类中定义,上面的Program类如不加static修饰符则会报错。
我们可以创建一个接口的扩展方法,这样实现该接口的类都可以调用该扩展方法。看下面一个完整示例:

///<summary>/// 购物车类 (实现 IEnumerable<Product> 接口)///</summary>publicclass ShoppingCart : IEnumerable<Product> {
public List<Product> Products { get; set; }
public IEnumerator<Product> GetEnumerator() {
return Products.GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
    }
}
///<summary>/// 定义一个静态类,用于实现扩展方法(注意:扩展方法必须定义在静态类中)///</summary>publicstaticclass MyExtensionMethods {
///<summary>
/// 计算商品总价钱
///</summary>
publicstaticdecimal TotalPrices(this IEnumerable<Product> productEnum) {
decimal total = 0;
foreach (Product prod in productEnum) {
            total += prod.Price;
        }
return total;
    }
}
class Program {
staticvoid Main(string[] args) {
// 创建并初始化ShoppingCart实例,注入IEnumerable<Product>
        IEnumerable<Product> products = new ShoppingCart {
            Products = new List<Product> { 
new Product {Name = "Kayak", Price = 275}, 
new Product {Name = "Lifejacket", Price = 48.95M}, 
new Product {Name = "Soccer ball", Price = 19.50M}, 
new Product {Name = "Corner flag", Price = 34.95M}
            }
        };
// 创建并初始化一个普通的Product数组
        Product[] productArray = { 
new Product {Name = "Kayak", Price = 275M}, 
new Product {Name = "Lifejacket", Price = 48.95M}, 
new Product {Name = "Soccer ball", Price = 19.50M}, 
new Product {Name = "Corner flag", Price = 34.95M} 
        };

// 取得商品总价钱:用接口的方式调用TotalPrices扩展方法。
decimal cartTotal = products.TotalPrices();
// 取得商品总价钱:用普通数组的方式调用TotalPrices扩展方法。
decimal arrayTotal = productArray.TotalPrices();

        Console.WriteLine("Cart Total: {0:c}", cartTotal);
        Console.WriteLine("Array Total: {0:c}", arrayTotal);
        Console.ReadKey();
    }
}

5.Lambda 表达式
Lambda 表达式和匿名函数其实是一件事情。不同是,他们语法表现形式不同,Lambda 表达式在语法上实际上就是匿名函数的简写。直接介绍匿名函数和Lambda表达式的用法没什么意思,在这里,我要根据实际应用来讲一个两者用法的例子,这样在介绍知识点的同时也能和大家分享一下解决问题的思想。
假如我们要实现一个功能强大的商品查询方法,这个商品查询方法如何查询商品是可以由用户自己来决定的,用户可以根据价格来查询商品,也可以根据分类来查询商品等等,也就是说用户可以把自己的查询逻辑传递给这个查询方法。要编写这样一个方法,我们很自然的会想到用一个委托来作为这个方法的参数,这个委托就是用户处理商品查询的逻辑。 我们不防把这个查询方法称为“商品查询器”。我们可以用静态的扩展方法来实现这个“商品查询器“,这样每个商品集合对象(如 IEnumerable products)可以直接调用该静态方法返回查询结果。解决问题的思想有了,接下来就是实现了。或许你对这一段描述有点蒙,结合代码可能让你更清晰。下面是这个“商品查询器”-Filter方法的实现代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前台: (1)注册登录模块:按照学校的相关规定进行注册和登录。 (2)招聘信息查看:高校毕业生们可以网站首页上查看所有的招聘信息,除此之外还可以输入公司名称或岗位名称进行搜索。 (3)用人单位模块:此模块为宣传用人单位的主要功能模块,具体包括用人单位简介、岗位需求及职责及公司介绍等功能。 (4)就业指导:学生朋友们在就业前可以通过此模块获取指导。 (5)新闻信息:为了让用户们可以了解到最新的新闻动态,本系统可以通过新闻信息查看功能阅读近期的新闻动态。 (6)在线论坛:毕业季的同学们可以通过此模块相互交流。 后台: (1)系统用户管理模块:可以查看系统内的管理员信息并进行维护。 (2)学生管理模块:通过此功能可以添加学生用户,还可以对学生信息进行修改和删除。 (3)用人单位管理模块:管理员用户通过此模块可以管理用人单位的信息,还可以对用人单位信息进行查看和维护。 (4)招聘管理模块:管理员通过此功能发布和维护系统内的照片信息。 (5)就业指导管理模块:通过此模块可以编辑和发布就业指导信息,从而更好的帮助就业季的同学们。 (6)论坛管理:通过论坛管理可以查看论坛中的主题帖及里面的回复信息,除此之外还可以对论坛中的信息进行维护和管理。
RLock 是 Python 中的一个线程锁对象,它允许多个线程同时访问一个共享资源,但是只允许一个线程修改该共享资源。在使用 RLock 进行加锁时,同一个线程可以多次加锁,每次加锁都会增加锁的层数,解锁时也需要解除对应层数的锁。 关于自动锁,RLock 并没有提供直接的支持。如果需要实现自动锁的功能,可以结合使用 RLock 和 threading.Timer 对象,代码大致如下: ```python import threading class AutoRenewRLock: def __init__(self): self.rlock = threading.RLock() self.timer = None def acquire(self, timeout=None): self.rlock.acquire() if timeout is not None: self.timer = threading.Timer(timeout, self.acquire) self.timer.start() def release(self): self.rlock.release() if self.timer is not None: self.timer.cancel() self.timer = None ``` 在上面的代码中,我们将 RLock 封装在 AutoRenewRLock 类中,并添加了 acquire 和 release 方法。其中 acquire 方法允许传入一个 timeout 参数,表示自动锁的时间。如果 timeout 不为 None,则会创建一个 Timer 对象,在 timeout 秒后再次调用 acquire 方法,从而实现自动锁的功能。当调用 release 方法时,会取消 Timer 对象,确保锁的正确释放。 使用时,可以将 AutoRenewRLock 对象当作普通的 RLock 对象来使用,例如: ```python lock = AutoRenewRLock() def func(): with lock: # do something ``` 在上面的例子中,通过 with 语句自动获取和释放锁,同时也自动锁,确保共享资源在一定时间内不会被其他线程抢占。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值