C#边边角角(一)
2014-11-20 21:59 周信达 阅读(357) 评论(0) 编辑 收藏 举报前言
此篇为在学习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 }; } } }
结语
此系列未完待续,希望学习可以持续下去,把它当做一种乐趣,加油!