当前位置: 首页 > news >正文

关键词诊断优化全部关键词上海做网站就用乐云seo

关键词诊断优化全部关键词,上海做网站就用乐云seo,网站建设功能点价格,中信建设有限责任公司西安分公司上一篇说了一下委托#xff0c;这篇来说说局部函数和委托的对比。把委托和局部函数放成前后篇#xff0c;是因为这两个内容很像#xff0c;用起来容易混。需要了解委托相关内容#xff0c;可以看这一篇 【传送门】使用委托表达式(Lambda)假设一个场景#xff1a;我们有一个… 上一篇说了一下委托这篇来说说局部函数和委托的对比。 把委托和局部函数放成前后篇是因为这两个内容很像用起来容易混。需要了解委托相关内容可以看这一篇 【传送门】 使用委托表达式(Lambda)假设一个场景我们有一个订单列表里面有售价和采购价。我们需要计算所有物品的毛利率。public class OrderDetails {public int Id { get; set; }public string ItemName { get; set; }public double PurchasePrice { get; set; }public double SellingPrice { get; set; } } 通过迭代我们可以计算出每个项目的毛利率static void Main(string[] args) {ListOrderDetails lstOrderDetails  new ListOrderDetails();lstOrderDetails.Add(new OrderDetails() { Id  1, ItemName  Item 1, PurchasePrice  100, SellingPrice  120 });lstOrderDetails.Add(new OrderDetails() { Id  2, ItemName  Item 2, PurchasePrice  800, SellingPrice  1200 });lstOrderDetails.Add(new OrderDetails() { Id  3, ItemName  Item 3, PurchasePrice  150, SellingPrice  150 });lstOrderDetails.Add(new OrderDetails() { Id  4, ItemName  Item 4, PurchasePrice  155, SellingPrice  310 });lstOrderDetails.Add(new OrderDetails() { Id  5, ItemName  Item 5, PurchasePrice  500, SellingPrice  550 });Funcdouble, double, double GetPercentageProfit  (purchasePrice, sellPrice)  (((sellPrice - purchasePrice) / purchasePrice) * 100);foreach (var order in lstOrderDetails){Console.WriteLine($Item Name: {order.ItemName}, Profit(%) : {GetPercentageProfit(order.PurchasePrice, order.SellingPrice)} );} } 例子中我们创建了一个有5个商品的列表。我们还创建了一个委托表达式并在循环中调用。     我们来看看这个委托表达式在IL中是什么样子图上能很清楚看到Lambda被转换成了类。等等为什么lambda表达式被转成了类而不是一个方法这里需要划重点。Lambda表达式在IL中会被转为委托。而委托是一个类。关于委托为什么是一个类可以去看上一篇。这儿知道结论就好。所以Lambda表达式会转成一个类应该通过一个实例来使用。而这个实例是new出来的所以是分配在堆上的。另外通过IL代码我们也知道IL是使用虚方法callvirt来调用的这个表达式。 现在我们知道了一件事Lambda会被转成委托和类由这个类的一个实例来使用。这个对象的生命周期必须由GC来处理。使用局部函数(Local Function)上面的示例代码我们换成局部函数static void Main(string[] args) {ListOrderDetails lstOrderDetails  new ListOrderDetails();lstOrderDetails.Add(new OrderDetails() { Id  1, ItemName  Item 1, PurchasePrice  100, SellingPrice  120 });lstOrderDetails.Add(new OrderDetails() { Id  2, ItemName  Item 2, PurchasePrice  800, SellingPrice  1200 });lstOrderDetails.Add(new OrderDetails() { Id  3, ItemName  Item 3, PurchasePrice  150, SellingPrice  150 });lstOrderDetails.Add(new OrderDetails() { Id  4, ItemName  Item 4, PurchasePrice  155, SellingPrice  310 });lstOrderDetails.Add(new OrderDetails() { Id  5, ItemName  Item 5, PurchasePrice  500, SellingPrice  550 });double GetPercentageProfit(double purchasePrice, double sellPrice){return (((sellPrice - purchasePrice) / purchasePrice) * 100);}foreach (var order in lstOrderDetails){Console.WriteLine($Item Name: {order.ItemName}, Profit(%) : {GetPercentageProfit(order.PurchasePrice, order.SellingPrice)} );} } 现在我们在Main方法中放入了局部函数GetPercentageProfit。我们再检查下IL里的代码没有新类没有新对象只是一个简单的函数调用。此外Lambda表达式和局部函数的一个重要区别是IL中的调用方式。调用局部函数用call它比callvirt要快因为它是存储在堆栈上的而不是堆上。通常我们不需要关注IL如何运作但好的开发人员真的需要了解一些框架的内部细节。call和callvert的区别在于call不检查调用者实例是否存在而且callvert总是在调用时检查所以callvert不能调用静态类方法只能调用实例方法。 还是上面的例子这回我们用迭代器实现static void Main(string[] args) {ListOrderDetails lstOrderDetails  new ListOrderDetails();lstOrderDetails.Add(new OrderDetails() { Id  1, ItemName  Item 1, PurchasePrice  100, SellingPrice  120 });lstOrderDetails.Add(new OrderDetails() { Id  2, ItemName  Item 2, PurchasePrice  800, SellingPrice  1200 });lstOrderDetails.Add(new OrderDetails() { Id  3, ItemName  Item 3, PurchasePrice  150, SellingPrice  150 });lstOrderDetails.Add(new OrderDetails() { Id  4, ItemName  Item 4, PurchasePrice  155, SellingPrice  310 });lstOrderDetails.Add(new OrderDetails() { Id  5, ItemName  Item 5, PurchasePrice  500, SellingPrice  550 });var result  GetItemSellingPice(lstOrderDetails);foreach (string s in result){Console.WriteLine(s.ToString());} }private static IEnumerablestring GetItemSellingPice(ListOrderDetails lstOrderDetails) {if (lstOrderDetails  null) throw new ArgumentNullException();foreach (var order in lstOrderDetails){yield return ($Item Name:{order.ItemName}, Selling Price:{order.SellingPrice});} } 我们将列表传递给GetItemSellingPice。我们在方法中检查了列表不能为null并在循环中使用yield return返回数据。代码看起来没问题是吧那我们假设列表真的为空会怎么样呢应该会返回ArgumentNullException预期是这样。执行一下看看实际不是这样。当我们使用迭代器时方法并没有立即执行并返回异常而是在我们使用结果foreach (string s in result)时才执行并返回异常。这种情况会让我们对于异常的判断和处理出现错误。这时候局部函数就是一个好的解决方式static void Main(string[] args) {var result  GetItemSellingPice(null);foreach (string s in result){Console.WriteLine(s.ToString());} }private static IEnumerablestring GetItemSellingPice(ListOrderDetails lstOrderDetails) {if (lstOrderDetails  null) throw new ArgumentNullException();return GetItemPrice();IEnumerablestring GetItemPrice(){foreach (var order in lstOrderDetails){yield return ($Item Name:{order.ItemName}, Selling Price:{order.SellingPrice});}} } 现在我们正确地在第一时间得到异常。总结局部函数是一个非常强大的存在。它与Lambda表达式类似但有更优的性能。又是一个好东西是吧
http://www.huolong8.cn/news/198825/

相关文章:

  • 长沙市网站制作多少钱阿里云虚拟主机怎么建立网站
  • 能做wordpress的网站郑州电力高等专科学校招生官网
  • 手机网站被拦截怎么办怎么解决网站内容创造
  • 安县建设局网站wordpress 能上传apk吗
  • 总行网站建设银行报绥化做网站
  • 珠海网站设计网络优化页游大全
  • 在线商城网站备案给公司做一个网站
  • 临沂市建设官方网站建设职业技术学院官网
  • 赣州专业网站推广网站人员队伍建设落后
  • 建设银行网站能买手机保定网络营销网站
  • 义乌网站建设方案案例工业设计专业是干嘛的
  • 商城类型的网站怎么做重庆南坪网站建设
  • 网站怎么做动态图上海公司查询网站
  • 宁波 住房和建设局网站省级建筑信息平台
  • 网站空间和主机慈溪建设局网站
  • 山东省住房与建设厅网站重庆个人网络营销电话
  • 提供网站制作价格郑州市网站建设公司
  • wordpress 古腾堡深圳seo优化推广公司
  • 做的网站百度找不到了广告联盟哪个比较好
  • 怎么做新网站上线通稿wordpress 二级域名
  • 做平面设计去哪些网站找图网站续费公司
  • 怎么查网站死链接泰安人才招聘信息网
  • 做网站要源码吗做网站用的云控制台
  • 网站开发商怎么样做网站赚钱吗
  • 苏州淘宝网站建设长沙网络开发公司
  • 好的网站具备条件网站建设销售技巧
  • 东莞专业做网站网站运营工作内容
  • 郴州哪里做网站电脑网
  • 杭州知名的企业网站建设策划免费建立自己的网站代码
  • 自己做的视频可以传别的网站去吗用老域名做网站还是新域名