• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#边边角角(一)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

此篇为在学习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 };
        }
    }
}

结语

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#JavaDES加密解密发布时间:2022-07-10
下一篇:
C#实现工作日和休息日(包括法定节假日)的计算发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap