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);
}

C#技巧与解析(部分)的更多相关文章

  1. 为数不多的人知道的 Kotlin 技巧及解析

    文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...

  2. SilkTest Q&A 4

    Q31.如何在inc文件里面写函数? A31.在你在inc文件(例如demo.inc)里写好函数以后,你需要使用Use path/Use file来指定指定它们. 在SilkTest中->Opt ...

  3. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  4. Mac命令行

    参考:http://www.cnblogs.com/-ios/p/4949923.html 必读 涵盖范围: 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处.本文致力于做到覆盖面广(尽 ...

  5. ES6 完全使用手册

    前言 这里的 "ES6" 泛指 ES5 之后的新语法 这里的 "完全" 是指本文会不断更新 这里的 "使用" 是指本文会展示很多 ES6 的 ...

  6. 应用安全-Web安全-子域名/相关域名

    技巧 DNS解析记录 主站获取 单点登录接口 crossdomain.xml IP反查 通过HTTPS证书收集 DNS域传送搜集 联系人信息/邮箱反查域名 x-dns-prefetch-control ...

  7. webshell学习

    参考文章: https://www.bilibili.com/video/BV1T4411t7BW?p=14 https://blog.csdn.net/mmmsss987/article/detai ...

  8. 解析提高PHP执行效率的50个技巧

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...

  9. Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...

随机推荐

  1. IDEA 2019 注册码

     CATF44LT7C-eyJsaWNlbnNlSWQiOiJDQVRGNDRMVDdDIiwibGljZW5zZWVOYW1lIjoiVmxhZGlzbGF2IEtvdmFsZW5rbyIsImFz ...

  2. leetcode309 买卖股票

    一.穷举框架 首先,还是一样的思路:如何穷举?这里的穷举思路和上篇文章递归的思想不太一样. 递归其实是符合我们思考的逻辑的,一步步推进,遇到无法解决的就丢给递归,一不小心就做出来了,可读性还很好.缺点 ...

  3. BugkuCTF~Misc~WriteUp

    1.签到 get flag: Qftm{You should sign in} 2.这是一张单纯的图片 查看图片十六进制 提去特殊字符串进行解码 get flag: key{you are right ...

  4. VMware vSphere6.0 服务器虚拟化部署安装图解(最全,最详细)-搭建的所有步骤

    VMware vSphere6.0 服务器虚拟化部署安装图解 一 .VMware vSphere部署的前期规划要点 1.vSphere的优点 (略) 2如何利用现在的设备架构虚拟化环境 在虚拟化过程中 ...

  5. 使用while循环来处理列表和字典——参考Python编程从入门到实践

    1. 在列表之间移动元素 unconfirmed_users = ['alice', 'brian', 'candace'] confirmed_users = [] # 验证每个用户,知道没有未验证 ...

  6. Python进阶:程序界的垃圾分类回收

    垃圾回收是 Python 自带的机制,用于自动释放不会再用到的内存空间: 什么是内存泄漏呢? 内存泄漏,并不是说你的内存出现了信息安全问题,被恶意程序利用了,而是指程序本身没有设计好,导致程序未能释放 ...

  7. Spring Cloud Stream如何消费自己生产的消息

    在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问 ...

  8. wait(),notify(),notifyAll()必须加锁的原因

    从语义方面解析为什么需要锁: 1.wait()方法会释放锁,如果没有先获得锁,那么如何释放? 从实际的作用: 为了预防饥饿线程的产生. 原因: // 线程A 的代码 while(!condition) ...

  9. 集成maven和Spring boot的profile

    如果在配置中勾选了多套配置,则以pom.xml文件中 profiles中  配置 最后一个配置为准. maven中配置profile节点: <project> .... <profi ...

  10. Disruptor分布式id生成策略

    需要的pom文件: <!-- 顺序UUID --> <dependency> <groupId>com.fasterxml.uuid</groupId> ...