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. ansible的基础使用(一)

    ansible基础使用(一) ansible的主要功能 A:为什么是ansible B:ansible的安装 C:ansible的相关文件 D:ansible的基本使用 ansible的简单操作 A: ...

  2. GraphQL简介

    原文地址 https://flaviocopes.com/graphql/ 中译文地址 什么是GraphQL GraphQL的原则 GraphQL vs REST Rest是一个概念 单个端点 根据你 ...

  3. jQuery实现简单导航栏的样式切换

    style css样式部分: ul{ margin: 0 auto; height: 50px; background-color: #369;} ul>li{ text-decoration: ...

  4. html2canvas以及domtoimage的使用踩坑总结

    前言 首先做个自我介绍,我是成都某企业的一名刚刚入行约一年的前端,在之前的开发过程中,遇到了问题,也解决了问题,但是在下一次解决相同问题的时候,只对这个问题有一丝丝的印象,还需要从新去查找,于是,我注 ...

  5. backpropagation algorithm

    搞卷积神经网络的时候突然发现自己不清楚神经网络怎么训练了,满脸黑线,借此机会复习一下把. 首先放一位知乎大佬的解释.https://www.zhihu.com/question/27239198?rf ...

  6. JAVA MyBybatis分页

    java: import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; impo ...

  7. WebAPI 之问题记录

    这篇博客是博主的第一篇博客,主要用于webapi学习过程中的问题记录 问题1:  重写OnAuthorization权限验证时,遇到AllowAnonymousAttribute特性不起作用的问题 p ...

  8. [jsp学习笔记]servelt get post

    1.post提交数据是隐式的,get是通过在url里面传递的(可以看一下你浏览器的地址栏),用来传递一些不需要保密的数据. 2.用get时,传输数据的大小有限制 (注意不是参数的个数有限制),为2K: ...

  9. ASP.Net Core 2.1+ Cookie 登录授权验证【简单Cookie验证】

    介绍 本文章发布于博客园:https://www.cnblogs.com/fallstar/p/11310749.html 作者:fallstar 本文章适用于:ASP.NET Core 2.1 + ...

  10. idea: unable to import maven project

    新搭建的maven环境,使用idea创建maven项目时,一直提示 unable to import maven project,百度良久未解决 有说关闭防火前的,亲测无效,后看到说是maven-3. ...