C#里面所有东西都可以看作对象.接口,类,枚举等等.
类是最常用的,可以继承别的接口,类等,就会自动拥有别人的功能.
接口是类的概要.给别人看的协议,好像一个人对外做出的承诺.
抽象类是实现了部分承诺,好像做了半生不熟的饭,还不能吃.常用在作为一批相同对象的基类.
类只是蓝图,文档.还不是对象,要New之后就是对象了.实例的方式很多.
类里面有属性,方法,字段,事件,命令等;
类主要是现实世界内的名词.比较复杂的,有多个部件组成的东西.
属性是对象拥有的状态.比如你的年龄,相貌等;其实就是提供2个方法来管理内部字段.为了保证字段的合法性,比如年龄不能为负,也不能大于1000年;
在Wpf里面,属性的设置里面常常加上一个属性变更通知方法,用来更新UI界面.
如: set { SetProperty(ref fieldName , value); }
列表数组如果想在内部有变动时候通知UI界面,需要继承ObservableCollection<T>即可
如 public ObservableCollection<string> 变化带通知数组 { get; set; }
依赖属性很好.继承来的属性如果没变化,就不占自己的内存.需要属性类型为DependencyObject;
附加属性是个好东西,本来自己没有的属性,可以直接拿来用.相当于吸星大法.
事件就是类对于其他类的变化的反应.相当于人的感官.由外部的刺激引发自己的方法.或者向外部宣传自己的状态变化.如老板发红包了,马上就去抢一下.主要是对外界环境变化的一种反应.怎么反应还是调用自己的方法.优点就是解耦了事件源和处理者.不管谁发红包.我都想去抢一个.
先声明一个事件类
public class 弹出消息Event : PubSubEvent<I消息> { }
在订阅事件发生时候通知我,
IEventAggregator 新闻部;
新闻部.GetEvent<弹出消息Event>().Subscribe(弹出消息处理, true);
方法就是对象拥有的技能;主要是动词.比如:写(代码),跑(步),听(音乐),可以不返回结果,或者只能返回1个结果.参数可以有多个.但也不建议很多个,会看的眼晕.
如果想返回多个结果,可以用自定义类型,或者元组Tuple<T1, T2> 组合最多8个;
扩展方法很好用,可以在不改变原有类代码的基础上增加新功能.适合为别人写好的类库添加自己想要的功能.只能增加实例的扩展,不能增加类的静态方法.如增加百分比转换
public static string To百分比(double 数值)
{ return 数值.ToString("p"); }
为数值增加范围限制:
public static T 范围限制<T>(this T 待测值, T 最小, T 最大) where T : IComparable<T>
{
var min = 待测值.CompareTo(最小) > 0 ? 待测值 : 最小;
var max = min.CompareTo(最大) > 0 ? 最大 : min;
return max;
}
命令就是把方法包装一下,对外提供的服务.方便前台界面和后台代码关联.
常见的public ICommand 干活Command { get; set; }
干活Command = new DelegateCommand<object>(工作方法Action);
可以不带参数或者带1个参数.
参数:
对象可以做为参数传递给别人.加工处理后再返回.这是最常见的方式.
如给老婆一堆脏衣服,老婆会给我一堆干净衣服.
public 衣服 老婆(衣服 脏衣服)
{
return new 衣服("干净");
}
方法也可以做为参数.等于把处理方法传递给别人.好像是苹果找富士康外包:提供材料,提供生产管理方式.
常用的方法有Action<参数1,参数2>;不返回结果.
Func<参数1,结果>;加工参数后返回结果.
如给老婆大米,再告诉她蒸米方法.就能做出一顿米饭来.
public Func<大米,米饭> 蒸米= 米=> { return new 米饭("可口"); };
public 米饭 老婆(Func<大米, 米饭> 蒸米方法, 大米 东北大米)
{
return 蒸米(东北大米);
}
LINQ
LINQ是查询数据的强大方便工具.只需一套方法,可以查询对象,SQL,XML等等数据源.常用的就是where 过滤,orderby 排序,toList投影出来. 如果数据多,分页显示也方便用Skip.
var find = from 车次 in 所有车次
where 车次.出发车站 == 南京
&& 车次.到达车站 == 苏州
&& 车次.出发时间 >= DateTime.Now.AddHours(2)
orderby 车次.出发时间
select 车次;
var 一页数据 = find数据.Skip(页数 * 每页显示).Take(每页显示);
查询到的数据常常在后台进程,如果要推送到界面.可以在界面进程调用更新.异步调用也行.
var UI线程= Application.Current.MainWindow.Dispatcher;
UI线程.Invoke(() => { 更新数据(新数据)}, DispatcherPriority.Normal);
学习linq有个好工具,LinqPad,
南京找工作中…欢迎推荐;微信FMTV365