DesignMode

以下项目在设计器界面,需判断DesignMode

  • OnPaint(e)/Form_Paint

自定义控件中需要特殊方法进行判断,如下:

    public partial class Ctl : Control
    {
        public Ctl()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
            Graphics g = pe.Graphics;
            g.DrawRectangle(new Pen(Brushes.Black, 5), new Rectangle(5, 5, 30, 30));

            if (!this.IsDesignMode())
                g.FillEllipse(Brushes.Red, new Rectangle(5, 5, 30, 30));
        }

        protected virtual bool IsDesignMode()
        {
            // DesignMode 并不能反映当前环境是否是运行时,
            // 它只能告诉你这个控件当前是不是直接被设计器操作(嵌套的已经不算了) 
            bool designMode = false;
#if DEBUG
            designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime) ||
                 (Process.GetCurrentProcess().ProcessName == "devenv");
#endif
            return designMode;
        }
    }

    

override和new

  • 主要区别:

    • override重写基类中的方法;new是隐藏基类中的方法

    • override重写virtual override abstract修饰的方法;new可以隐藏基类中的虚方法和普通方法

    • override不能重写非虚方法和静态方法(注:静态类不能继承),不能使用new static virtual abstract修改override方法

    • new关键字用private修饰,则只在派生类中隐藏了基类方法,派生类之外没有隐藏基类方法(禁止使用这种情况,毫无意义)

  • virtual示例:

    public class Animal
    {
        public void Voice()
        {
            this.OnSound();
        }

        protected virtual void OnSound()
        {
            Console.WriteLine(Const.SOUND);
        }

    }

    public class Tiger:Animal
    {
        
        public void Sound()
        {
            base.OnSound();
        }

        protected override void OnSound()
        {
            //base.OnVoice();
            Console.WriteLine(Const.VOICE);
        }
    }

            Animal animal = new Animal();
            animal.Voice();
            //virtual重写
            Tiger tiger = new Tiger();
            tiger.Sound();
            tiger.Voice();
  • abstract示例:
    public abstract class Bird
    {
        public abstract void Fly();
    }

    public class Sparrow : Bird
    {
        //继承抽象类,必须实现抽象类的所有方法
        public override void Fly()
        {
            Console.WriteLine(Const.FLY);
        }
    }

            //abstract重写
            Sparrow sparrow = new Sparrow();
            sparrow.Fly();
  • override示例:
    public class Sparrow_Black : Sparrow
    {
        public override void Fly()
        {
            Console.WriteLine(Const.BLACK);
            base.Fly();
        }
    }

            //override重写
            Sparrow_Black black= new Sparrow_Black();
            black.Fly();
  • new 示例:
    public class Tiger_White:Tiger
    {
        public new void Sound()
        {
            Console.WriteLine();
        }
    }

            //new
            Tiger_White white = new Tiger_White();
            white.Sound();
            white.Voice();

可选参数

  • 可选参数必须在必备参数之后

  • 可选参数不能使用ref或out修饰符

  • 指定的默认值必须为常量:数字或字符串字面量、null、const成员、枚举成员和default(T)操作符

        public void Move(int speed = 100)
        {
            Console.WriteLine("移动速度:" + speed);
        }

            Animal animal = new Animal();
            animal.Move();
            animal.Move(200);

params可变参数

params参数是一维数组,必须是方法中最后一个参数

        public void Foot(params string[] foots)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var foot in foots)
                sb.Append(foot);
            Console.WriteLine(sb.ToString());
        }

            Animal animal = new Animal();
            animal.Foot("前肢");
            animal.Foot("前肢","后肢");
            animal.Foot(new string[] { "前肢", "后肢" });

可空类型

System.Nullable

            int? no = null;
            Console.WriteLine(no.HasValue);
            Console.WriteLine(no??0);

            no = 1;
            Console.WriteLine(no.HasValue);
            Console.WriteLine(no.Value);

扩展方法

  • 声明方法

    • 必须在一个非嵌套、非泛型的静态类中

    • 至少有一个参数

    • 第一个参数必须附加this关键字作为前缀

    • 第一个参数不能有其他任何修饰符

    • 第一个参数的类型不能是指针类型

    • 第一个参数的类型称为方法的扩展类型(extended type)

    public static class Util
    {

        public static bool IsEmpty(this string str)
        {
            if (string.IsNullOrEmpty(str))
                return true;
            str = str.Trim();
            if (string.IsNullOrEmpty(str))
                return true;
            return false;
        }
    }

            string str = null;
            string empty = string.Empty;
            string blank = "   ";

            Console.WriteLine(str.IsEmpty());
            Console.WriteLine(empty.IsEmpty());
            Console.WriteLine(blank.IsEmpty());

委托与多播委托

        public event EventHandler Eat;//事件

        public void OnEat(EventArgs args)
        {
            if (Eat != null)
                Eat(this, args);//触发事件
        }

            animal.Eat += Animal_Eat;//多播委托
            animal.Eat += Animal_Eat;

            animal.OnEat(new EventArgs());

        private static void Animal_Eat(object sender, EventArgs e)
        {
            Console.WriteLine(Const.EAT);
        }
posted @ 2019-10-22 08:52 北冥冰皇 阅读(464) 评论(0) 推荐(0) 编辑
摘要: 实体类: SQL语句 将double换成float出现错误。EF使用System.Double对应SQLServer中的float。 重点关注:此处对SQL语句的结果也有要求,结果必须转换为float,才能与实体类映射成功! 阅读全文
posted @ 2018-08-24 09:51 北冥冰皇 阅读(4427) 评论(0) 推荐(0) 编辑
摘要: 代理模式 代理模式 实现逻辑和实现的解耦 代理模式 为了提供额外的的操作,插入用来代替实际对象的对象。这些操作通常涉及与实际对象通信,代理充当中间人的角色 接口 实际对象 代理对象 测试 动态代理 Java动态代理可以动态创建代理并动态处理对所代理的方法的调用 在动态里上所做的所有调用都会被重定向到 阅读全文
posted @ 2018-06-08 11:40 北冥冰皇 阅读(579) 评论(0) 推荐(0) 编辑
摘要: 适配器模式用于消除接口不匹配造成的类兼容性问题 类模式的适配器采用继承的方式复用接口 对象模式的适配器采用组合的方式复用 适配器模式 对象模式 新建适配器,接受原类对象的所有方法,然后生成新需要的接口方法 原类对象 适配接口 适配器 测试 适配器模式 类模式 通过创建类继承类和实现接口来实现适配 原 阅读全文
posted @ 2018-06-06 09:33 北冥冰皇 阅读(509) 评论(0) 推荐(0) 编辑
摘要: 在工厂对象上调用创建方法,生成接口的某个实现的对象 通过这种方式,接口与实现分离 方法接口 工厂方法接口 方法实现 工厂方法实现 测试 阅读全文
posted @ 2018-06-06 09:33 北冥冰皇 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 创建一个能够根据所传递的参数对象的不同而具有不同行为的方法 要执行的算法固定不变,封装到一个类(Context)中 策略就是传递进去的参数对象,它包含执行代码 策略接口 具体实现 封装逻辑(算法) 测试 阅读全文
posted @ 2018-06-06 09:32 北冥冰皇 阅读(1999) 评论(0) 推荐(0) 编辑
摘要: 各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用线程都被阻塞,后续I/O都将在队列中排队 线程池采用阻塞队列实现,队列积满之后,后续入队列操作将被阻 阅读全文
posted @ 2018-05-29 17:40 北冥冰皇 阅读(2695) 评论(0) 推荐(0) 编辑
摘要: 异步委托 创建线程的一种简单方式是定义一个委托,并异步调用它 委托是方法的类型安全的引用 Delegate类还支持异步地调用方法。在后台,Delegate类会创建一个执行任务的线程 投票,并检查委托是否完成了任务 所创建的Delegate类提供了BeginInvoke()方法,该方法中,可以传递用委 阅读全文
posted @ 2018-05-23 15:09 北冥冰皇 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 多线程概述 抢占式多任务 直接中断而不需要事先和被中断程序协商 协作多任务 被中断程序同意交出控制权之后才能执行中断 多线程和多进程区别? 本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据 Thread Thread(Runnable target) 构造有一个新的线程来调用指定的 阅读全文
posted @ 2018-05-23 11:22 北冥冰皇 阅读(483) 评论(0) 推荐(0) 编辑
摘要: 设计背景 网上很火的一个“妈妈再打我一下”的漫画图片,给了网友无限的想象发挥空间,此小程序可以给图片添加配文的形式,快速生成图片 设计思路 GDI+ 绘图技术,在图片基础上添加文字 相关技术 GDI+ 代码示例 GitHub ".NET App/PicGenerater/" 阅读全文
posted @ 2018-05-16 14:00 北冥冰皇 阅读(496) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示