C#技巧与解析(部分)
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#技巧与解析(部分)的更多相关文章
- 为数不多的人知道的 Kotlin 技巧及解析
文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...
- SilkTest Q&A 4
Q31.如何在inc文件里面写函数? A31.在你在inc文件(例如demo.inc)里写好函数以后,你需要使用Use path/Use file来指定指定它们. 在SilkTest中->Opt ...
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- Mac命令行
参考:http://www.cnblogs.com/-ios/p/4949923.html 必读 涵盖范围: 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处.本文致力于做到覆盖面广(尽 ...
- ES6 完全使用手册
前言 这里的 "ES6" 泛指 ES5 之后的新语法 这里的 "完全" 是指本文会不断更新 这里的 "使用" 是指本文会展示很多 ES6 的 ...
- 应用安全-Web安全-子域名/相关域名
技巧 DNS解析记录 主站获取 单点登录接口 crossdomain.xml IP反查 通过HTTPS证书收集 DNS域传送搜集 联系人信息/邮箱反查域名 x-dns-prefetch-control ...
- webshell学习
参考文章: https://www.bilibili.com/video/BV1T4411t7BW?p=14 https://blog.csdn.net/mmmsss987/article/detai ...
- 解析提高PHP执行效率的50个技巧
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
随机推荐
- Python MySQLdb 学习总结(转)
转自http://www.cnblogs.com/coser/archive/2012/01/12/2320741.html 感谢@糖拌咸鱼 任何应用都离不开数据,所以在学习python的时候,当然也 ...
- TP5 模型CURD
ThinkPHP5的模型是一种对象-关系映射(Object / Relation Mapping ,简称 ORM)的封装,并且提供了简洁的ActiveRecord实现.一般来说,每个数据表会和一个“模 ...
- js实现之--防抖节流【理解+代码】
防抖: 理解:在车站上车,人员上满了车才发走重点是人员上满触发一次. 场景:实时搜索,拖拽. 实现: //每一次都要清空定时器,重新设置上计时器值,使得计时器每一次都重新开始,直到最后满足条件并且等待 ...
- java.IO.EOFException异常
错误代码为: 43 boolean booleanResult = dis.readBoolean();//dis为DateInputStream的实例 44 System.out.println(b ...
- free(分层图最短路)(2019牛客暑期多校训练营(第四场))
示例: 输入: 3 2 1 3 11 2 12 3 2 输出:1 题意:求s,t最短路,可将k条边权值置零. 题解:分层图最短路原题 #include<bits/stdc++.h> usi ...
- MySQL运维中的Tips--持续更新
1.into outfile 生成sql:一般都是生成文本或者其他形式的文件,现在需要生成sql形式的文件.配置文件加secure_file_priv=''select concat('insert ...
- html2canvas以及domtoimage的使用踩坑总结 动态获取的二维码失效如何生成海报
//判断手机为安卓还是ios 安卓html2canvas方法 ios系统dom-to-image方法 $(".code").click(function() { var u = n ...
- Elasticsearch-6.7.0系列(八)开启kibana监控
修改ES配置: 修改elasticsearch.yml,添加如下xpack配置: xpack.security.enabled: true xpack.ml.enabled: true xpack.l ...
- .net core使用ocelot---第六篇 负载均衡
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 .net core ...
- OO第4次博客作业
OO第4次博客作业 一.第4单元设计 第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识.个人认为编程操作在实质上与上一章的PathContainer有许多的相同之 ...