前言

此篇为在学习C#基础时,熟悉C#的语法和高级特性的一些小的尝试和笔记,记录一下以供分享

集合初始化器

  • 集合必须实现System.Collections.IEnumerable接口
  • 集合必须包含Add方法定义
class MyCollection<T> : IEnumerable
{
public void Add(T item) { } public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
}

foreach枚举支持

  • 误区

    • 集合必须实现IEnumerable接口
  • 正解
    • 包含GetEnumerator的公共定义
    • GetEnumerator返回的对象包括
      • 适当的公共方法MoveNext
      • 适当的公共属性Current
class MyCollection
{
public MyEnumerator GetEnumerator()
{
return new MyEnumerator();
}
} class MyEnumerator
{
public bool MoveNext()
{
return true;
} public int Current { get { return 1; } }
}

LINQ表达式支持

  • 误区

    • 集合或者实现IEnumerable接口
    • 集合或者实现IQueryable接口
  • 正解
    • 实现对应的Select方法
    • 实现对应的谓词条件方法
class MyQuery<T>
{
public MyQuery<R> Select<R>(Expression<Func<T, R>> func)
{
throw new NotImplementedException();
} public MyQuery<T> Where(Expression<Func<T, bool>> func)
{
throw new NotImplementedException();
}
}

动态扩展对象

  • 对象声明使用dynamic声明
  • 对象实现继承自DynamicObject
  • 实现DynamicObject的绑定方法实现
class MyExpando : DynamicObject
{
private Dictionary<string, object> _items
= new Dictionary<string, object>(); // Dynamic View
public override IEnumerable<string> GetDynamicMemberNames()
{
return _items.Keys;
} public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _items.TryGetValue(binder.Name, out result);
} public override bool TrySetMember(SetMemberBinder binder, object value)
{
_items[binder.Name] = value;
return true;
}
}

Async & Await模式支持

  • 类型必须提供GetAwaiter方法,该方法可以为扩展方法
  • GetAwaiter方法返回的awaiter对象
    • awaiter对象必须实现INotifyCompletion接口
    • awaiter对象必须包含IsCompleted的适当公开定义
    • awaiter对象必须包括GetResult的适当公开定义
namespace WinForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Enabled = true;
button2.Enabled = false;
} private async void Form1_Load(object sender, EventArgs e)
{
await button1; button1.Enabled = false;
button2.Enabled = true; await button2;
await button2; MessageBox.Show("Hello!");
}
} public class ButtonAwaiter : INotifyCompletion
{
public bool IsCompleted
{
get { return false; }
} public Button Button { get; set; } public void OnCompleted(Action continuation)
{
EventHandler handler = null;
handler = (o, e) =>
{
Button.Click -= handler;
continuation();
}; Button.Click += handler;
} public void GetResult()
{
}
} public static class ButtonExtensions
{
public static ButtonAwaiter GetAwaiter(this Button button)
{
return new ButtonAwaiter { Button = button };
}
}
}

结语

此系列未完待续,希望学习可以持续下去,把它当做一种乐趣,加油!

C#边边角角(一)的更多相关文章

  1. C#拾遗-边边角角

    1.扩展方法 public static 方法返回值类型 扩展方法名(this 要扩展类型 obj,调用扩展方法时需要的参数){ return "返回值"} 2.运算符重载 pub ...

  2. spring边边角角

    我们在使用ssh框架的时候,很多人抱怨为什么之前都运行得好好的,第二天就报错了,我也是被这个问题纠结了很久. 我们来看看spring的配置文件: <?xml version="1.0& ...

  3. Bean Validation完结篇:你必须关注的边边角角(约束级联、自定义约束、自定义校验器、国际化失败消息...)

    每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349.JSR380)H ...

  4. shell 边边角角

    [Shell学习笔记] 数组.关联数组和别名使用 Linux中bash脚本数组和字典使用举例 Linux Shell 通配符.元字符.转义符使用实例介绍

  5. Linux基础命令之——边边角角

    linux基础指令的内容较多,总共一百多条,包含一些服务120条左右(误差不超过一个亿),选项也五花八门,但是有些较为实用的命令或者选项在使用的过程中又会一时想不起来,降低了工作效率. 因此,专门做一 ...

  6. 【绝对干货】仿微信QQ设置图形头像裁剪,让你的App从此炫起来~

    最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流. 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue ...

  7. 检验你的前端基础——Sit the test

    前端小学生向大家推荐一个网站:Sit the test.如果你是一名前端工程师或者立志于此,不妨试试此网站上面的测验题. 发现 十几天前,我在奇舞周刊的一篇文章中,发现了一个国外的技能测试网站:Sit ...

  8. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  9. [Android]使用MVP解决技术债务(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5892671.html 使用MVP解决技术债务 原文:https ...

随机推荐

  1. EMVTag系列5《8E 持卡人验证方法(CVM)名单》

    L: var. up to 252 -R(需求):数据必须存在,在读应用数据过程中,终端不检查 依照优先顺序列出卡片应用支持的全部持卡人验证方法 注:一个应用中能够有多个CVM列表,比如一个用于国内交 ...

  2. Oracle 数据导出到PowerDesigner

    原文:Oracle 数据导出到PowerDesigner [一]配置ODBC win7 :控制面板(查看方式:小图标)→管理工具→数据源(ODBC) 在[ODBC数据源管理器]面板下,在默认[用户DN ...

  3. vim note(3)

    Ctrl+w  Ctrl+v  will create a new window on the right side of the current window Ctrl+w  Ctrl+s   wi ...

  4. ios正在使用NSDateComponents、NSDate、NSCalendar它的结论是在当前时间是在一段时间在一天。

    一般应用程序设置这一组的存在,比如夜间模式,如果你.从8:00-23:00.在这个当前的时间是如何推断出期间.主要的困难在于如何使用NSDate生成8:00时间和23:00时间.然后用当前时间,也许有 ...

  5. Codeforces 514 D R2D2 and Droid Army(RMQ+二分法)

    An army of n droids is lined up in one row. Each droid is described by m integers a1, a2, ..., am, w ...

  6. neu1458 方格取数 dp解法

    题意: 有N * N个格子,每一个格子里有正数或者0,从最左上角往最右下角走,仅仅能向下和向右,一共走两次(即从左上角走到右下角走两趟),把全部经过的格子的数加起来,求最大值SUM,且两次假设经过同一 ...

  7. N-gram统计语言模型(总结)

    N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型 ...

  8. 小记NodeJS两项小技巧(与HTTP相关)

    1,兼容HTTP1.1和HTTP1.0 区别在content-length,1.0接受定长,不接受变长,导致transfer-encodeing的chunked模式无法识别,最终导致无法识别BODY. ...

  9. 备份IIS httpd.ini 重写规则,兼容大部分版本号IISserver

    IISserver已经非常少,差点儿要退出市场了.nginx成为市场的主流. 备份一个httpd.ini,全部内容例如以下: [ISAPI_Rewrite] # 3600 = 1 hour Cache ...

  10. 发现新大陆:一个最简单的破解SSL加密网络数据包的方法

    1. 简介 相信能访问到这篇文章的同行基本上都会用过流行的网络抓包工具WireShark,用它来抓取相应的网络数据包来进行问题分析或者其他你懂的之类的事情. 一般来说,我们用WireShark来抓取包 ...