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

网站如何做淘宝支付宝wordpress 主题猫

网站如何做淘宝支付宝,wordpress 主题猫,wordpress 移动 建站,优秀网页设计教程C#黑魔法:鸭子类型(Duck Typing) 如果它走起路来像鸭子,叫起来像鸭子,那么它就是鸭子。 鸭子类型,主要应用于动态语言类型,比如JS、Python等,核心理念为:关注对象的行为(方法或属性…

C#黑魔法:鸭子类型(Duck Typing)

如果它走起路来像鸭子,叫起来像鸭子,那么它就是鸭子。

鸭子类型,主要应用于动态语言类型,比如JS、Python等,核心理念为:关注对象的行为(方法或属性)而非其具体类型。只要对象具备所需行为,即可在特定场景中使用,无需显式继承或实现接口。

来,在C#中使用鸭子类型魔法:

await 不必是 Task和ValueTask 对象

TPL是官推荐的C#异步编程模型,几乎所有提到TPL异步编程时,都必须是async配合await,等待一个Task或ValueTask.

事实上,并不是只有 Task 和 ValueTask 才能 await:只要符合下列条件的类,都能await

  1. 类中包含 GetAwaiter() 实例方法:返回一个实现了 INotifyCompletion 接口的 awaiter 对象
  2. 类中包含 bool类型的 IsCompleted 属性:用于告知 awaiter 是否已经完成了其操作
  3. 类中包含一个 OnCompleted 方法:
    说个秘密:.NET Core 中的 I/O 相关的异步 API 也的确是这么做的,I/O 操作过程中是不会有任何线程分配等待结果的,都是 coroutine 操作:I/O 操作开始后直接让出控制权,直到 I/O 操作完毕。

而之所以有的时候你发现 await 前后线程变了,那只是因为 Task 本身被调度了。

public class CustomTask<T>
{public CustomAwaiter<T> GetAwaiter(){return new CustomAwaiter<T>();}
}public class CustomAwaiter<T> : System.Runtime.CompilerServices.INotifyCompletion
{public bool IsCompleted { get; private set; }public T GetResult(){Console.WriteLine("获取异步结果");return default(T);}public void OnCompleted(Action continuation){Console.WriteLine("注册异步完成回调");IsCompleted = true;continuation?.Invoke();}
}var obj = new CustomTask<int>();
var r = await obj;
r.Display();

foreach 不必是 IEnumerable 和 IEnumerator 对象

满足以下条件的对象,就能使用 foreach:

  1. 类中只要有 GetEnumerator() 方法即可;
  2. GetEnumerator() 返回的对象包含一个 bool MoveNext() 方法加一个 Current 属性
//作为 GetEnumerator 方法的返回类
public class CustomEnumerator<T>
{public T Current { get; private set; }public bool MoveNext(){//这里写业务逻辑return false;}
}//只要有GetEnumerator方法,且返回值符合要求,就行了。
public class CustomEnumerable<T>
{public CustomEnumerator<T> GetEnumerator(){return new CustomEnumerator<T>();}
}//使用 foreach 查询
var names = new CustomEnumerable<string>();
foreach(var name in names)
{Console.WriteLine(name);
}

LINQ 不必是 IEnumerable对象

常见的Linq表达式语法:

var result = from q in source 
where q.StartsWith("s") 
select q; 

代码中的 source 的类型不一定非要实现 IEnumerable 接口。

事实上,只要有对应名字的方法就可以了。比如:有了名为 Select 的方法就能用 select,有了名为 Where 的方法就能用 where

public class Custom<TSource>
{private readonly TSource value;public Custom(TSource value) { this.value = value; }public Custom<TResult> Select<TResult>(Func<TSource, TResult> selector){if (value == null){throw new ArgumentNullException(nameof(value));}if (selector == null){throw new ArgumentNullException(nameof(selector));}return new Custom<TResult>(selector(value));}public Custom<TSource> Where(Func<TSource, bool> predicate){var r = predicate(value);if (r){return this;}else{return null;}}public new string ToString() => $"自定义Linq类: {value}";
}

上面 Custom 类,有了 Select 和 Where 方法,就可以使用 linq表达式 select 和 where

//声明对象
var source = new Custom<string>("select");//使用linq表达式查询
var qResult =  from m in source where m.StartsWith("s")select new { Name=source.ToString(), Age=1 };//结果(转化成一个匿名类)
Console.WriteLine(qResult.ToString());

using 对象, 不必实现 IDisposable接口

ref struct 因为必须在栈上且不能被装箱,所以不能实现接口。

只要 ref struct 对象中有一个 void Dispose() 方法,那么就可以用 using 语法实现对象的自动销毁。

//声明带 void Dispose()方法的引用类struct
ref struct MyRefStruct
{public string ToLower(string source){return source.ToLower();}public void Dispose(){//清理业务}
}//使用using语句,实现自动销毁
using (var myRef = new MyRefStruct())
{Console.WriteLine(myRef.ToLower("ABCEDF"));
}

普通类也能解构(非解析)

给一个普通类实现解构:只需要有一个名字为 Deconstruct() 的方法,并且参数都是 out 的即可。

class MyDeconstruct
{private int A => 1;private int B => 2;public void Deconstruct(out int a, out int b){a = A;b = B;}
}//实现解析操作
var x = new MyDeconstruct();
var (o, u) = x;
Console.WriteLine($"解构后,o={o},u={u}");

文章转载自:

http://hHTtUNu4.hrnrx.cn
http://fUT2QMzk.hrnrx.cn
http://aDCoKCvb.hrnrx.cn
http://lltupsVV.hrnrx.cn
http://YMmzYCLc.hrnrx.cn
http://qtuKiQRr.hrnrx.cn
http://1JRpJXwi.hrnrx.cn
http://Agvio7xH.hrnrx.cn
http://u4Zh1CiT.hrnrx.cn
http://BNbRijn3.hrnrx.cn
http://l6ClpHR8.hrnrx.cn
http://ueqcSXqK.hrnrx.cn
http://SEpJcj74.hrnrx.cn
http://IUdvXaWO.hrnrx.cn
http://ZrJI027K.hrnrx.cn
http://zVj71Rg1.hrnrx.cn
http://urrQBi9P.hrnrx.cn
http://qOUk9uvH.hrnrx.cn
http://xIFW14EQ.hrnrx.cn
http://QO39cXXA.hrnrx.cn
http://Xfxwaxyv.hrnrx.cn
http://VOIud5QZ.hrnrx.cn
http://DkKgHJuc.hrnrx.cn
http://eyX2bgfb.hrnrx.cn
http://4cmjDjIM.hrnrx.cn
http://OsxB8QUg.hrnrx.cn
http://L9eqFRp5.hrnrx.cn
http://H9Hns41o.hrnrx.cn
http://kaKGXj76.hrnrx.cn
http://W4nIRcLR.hrnrx.cn
http://www.dtcms.com/wzjs/738284.html

相关文章:

  • 电子商务物流网站建设wordpress优化教程
  • 公司网站建设计划书seo的中文含义是什么
  • 网站建设编辑部wordpress 自定义字段 调用
  • 目标网站都有哪些内容部门规划书 网站建设
  • 360建设网站免费php网站管理系统下载
  • 个人电脑可以做网站服务器手机wap网站开发与设计
  • zzzcms建站系统dw做旅游网站毕业设计模板下载
  • 电竞网站开发需求报告怎么做网站设
  • 广州建设网站平台卓越亚马逊网站建设目的
  • 百度k了网站怎么办广告设计公司工作规范流程
  • 宁波网站制作公司费用价格icp是什么
  • 怎么开发手机网站创建网页教程
  • 简单的网站维护学历提升专升本
  • 为什么我的电脑有些网站打不开seo需要付费吗
  • html官方网站山东网站建设企业公司
  • 建设部网站社保联网06627网页制作与网站建设
  • 建设网站大概需要多少钱营销推广策略有哪些
  • 如何用书签 做网站接口如何更新网站快照
  • 从网络营销角度做网站中国建筑app下载
  • 陕西省建设监理协会网站证件查询网站可以不备案吗
  • 郴州网站网站建设学设计去哪个学校好
  • 共享ip网站 排名影响网站开发流程有哪几个阶段
  • 越秀网站建设婚纱摄影网站策划书
  • 视频网站程序模板缅甸最新消息
  • 做别人一摸一样的网站犯法吗网络营销推广方案pdf
  • 体育西网站开发价格检察院网站建设自查报告
  • 网站建设咨询服务计算机网站开发毕业设计论文开题报告
  • 杭州网站制作机构做网站需要会写代码6
  • 高职专业建设管理网站比较好的网站建设公司电话
  • 福建泉州做淘宝的拿货什么网站网络工程师要考哪些证