前言
此篇为在学习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 };
}
}
}
结语
此系列未完待续,希望学习可以持续下去,把它当做一种乐趣,加油!