zoukankan      html  css  js  c++  java
  • 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 };
            }
        }
    }

    结语

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

  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/fecktty2013/p/csharp-corner-1.html
Copyright © 2011-2022 走看看