• C#边边角角(一)


    前言

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

    结语

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

  • 相关阅读:
    ireport字体无效处理
    java web调用打印机打印pdf文件
    Extjs中如何在一行textfield后面增加文字提示
    java 压缩文件
    filter加载springbean
    Elasticsearch问题记录
    dubbo管控台的安装记录及dubbo开发调试记录
    mysql索引整理
    fastdfs集群搭建3
    fastdfs集群搭建2
  • 原文地址:https://www.cnblogs.com/fecktty2013/p/csharp-corner-1.html
Copyright © 2020-2023  润新知