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. 学习数据结构Day4

    链表 之前看过了动态数组,栈和队列,虽然我们把第一个叫做动态数组,但是,他们的底层实质上还是静态数组.靠 resize来实现动态数组.而链表是真正的数据结构 链表需要一个节点. 数据存储在链表中 相当 ...

  2. enum类型的标签内容根据语言的取法

    昨天做了一个开发,说要取enum里面英文label 例如  JournalType   枚举值有   transfer\profit/loss 但是在中文的AX系统时会显示“转移\盈亏”, 但是客户又 ...

  3. JavaScript中数组的key-value在对象中倒装的妙用

    对于数组的去重.寻找指定元素的索引,通常我们都是通过遍历来解决,但是在某些应用场景下,将数组的value-key进行倒装,也即将value当做对象的key,key当做对象value,可以极大降低算法的 ...

  4. Spring Spring boot 获取IOC中的bean,ApplicationContext

    https://blog.csdn.net/weixin_38361347/article/details/89304414 https://www.jianshu.com/p/9ea13b00b1d ...

  5. c# 操作xml文件(读写)

    根据项目需求,我们需要记录用户的操作痕迹,当用户下次登录操作同一个文件时,页面显示为用户上一次执行的用户轨迹,我们考虑把用户的历史记录写进xml文件中. 存储的xml数据结构: XML操作类: usi ...

  6. AspNetCore网关集成Swagger访问使用IdentityServer保护的webapi项目

    创建webapi项目 创建四个webapi项目,两个处理业务,一个网关,一个验证中心.四个项目对应的端口如下, ApiGateway:1999 IdentityServer:16690 Service ...

  7. Replace到达地

    string getcstr(string cs)        {            String SplitKey = @"乌孜别克族,柯尔克孜族,维吾尔族, 鄂伦春族, 哈萨克族, ...

  8. PreparedStatement和批处理

    1.概述 PreparedStatement 接口继承了 Statement,并与之在两方面有所不同,它表示预编译的 SQL 语句对象. 首先,数据库会对预编译语句提供性能优化.因为预编译语句有可能被 ...

  9. Ubuntu 18.04 LTS版本 GIMP安装

    为何安装? GIMP全称GNU Image Manipulation Program,是Linux下的一款图片处理软件,功能基本完备,用户体验不错. 如何安装? 命令:sudo apt install ...

  10. JS权威指南读书笔记(五)

    第十三章 Web浏览器中的JavaScript 1 在Html文档中嵌入客户端4种JS代码方法     a 内联方式,放置在<script>标签之间     b 放置在<script ...