1.Abstract类
参考链接:https://www.cnblogs.com/shadoll/p/14491693.html
简介
abstract意思是抽象。在C#中,abstract修饰符只用在两个地方,一是修饰类,二是修饰方法。被abstract定义的类或方法,叫做抽象类或抽象方法。
抽象方法必须存在于抽象类之中。
派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。
通常抽象类会被其他类继承,并重写其中的抽象方法或者虚方法。
抽象类内部可以包含非抽象成员。
抽象方法必须用在抽象类中,有抽象类的不一定有抽象方法
实例1
public abstract class A
{
public abstract void Func();//抽象方法只能定义在抽象类中,没有方法体
public void Func2()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void Func()
{
Console.WriteLine("B");
}
}
实例2
namespace _01.多态抽象方法和抽象类
{
class Program
{
static void Main(string[] args)
{
Pig pig = new Pig(); //实例化派生类 等价于 Aniaml pig = new Pig();
pig.Shout();//使用派生类对象实例化抽象类
Console.ReadKey();
}
}
public abstract class Aniaml//声明抽象类
{
public abstract void Shout(); //抽象方法只能定义在抽象类中,没有方法体
}
public class Pig:Aniaml //继承抽象类,子类必须重写抽象方法
{
public override void Shout() //重写抽象类的抽象方法
{
Console.WriteLine("哼哼。。。");
}
}
}
抽象类的使用场景应该是,如果设计一个类的目的是用来被其它类继承,它代表一类对象所具有的公共属性和方法,那就可以设置为抽象类。
总结
1.包含抽象方法的类都是抽象类,该类必须加abstract修饰。
2.抽象类中不必一定包含抽象方法,此时在抽象类的方法必须是静态方法。
3.抽象类不能实例化,但仍然可以具有构造函数。
4.在实现抽象类时,子类必须实现抽象类中声明的抽象方法。
5.抽象类中可以包含非抽象的方法。
6.继承的子类没实现其中的抽象方法,那么这个子类也是抽象类。
7.抽象方法也是虚拟的,但不需要使用virtual关键字。
8.抽象类不能被sealed密封。
9.在抽象方法声明中不能使用static修饰符。
10. 抽象类不能被实例化。
11.抽象类下的抽象方法没有具体的实现,但在派生类中必须实现。
12.抽象类就是用来继承的,因此不能用sealed修饰符修饰抽象类。
2.virtual 方法
virtual修饰符不能与static、abstract, private或override修饰符一起使用。
public virtual void AdaptSetting(){}
https://www.cnblogs.com/shadoll/p/14464853.html
前言
在使用C#开发的过程中,我们经常可以看到virtual关键字,这个关键字具体的使用场景是有类做实现继承,父类通过virtual设置虚方法,子类可以通过override来重写该方法。
编译原理
一般函数在编译时就静态地编译到执行文件中,其相对地址在程序运行期间是不发生变化。虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它在运行期间根据对象实例来判断要调用的函数。
虚方法和抽象方法比较
虚方法 | 抽象方法 |
用virtual修饰 | 用abstract修饰 |
基类中要有方法体 | 基类中不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类都可以写 | 只能在抽象类中 |
3.重写override
https://www.cnblogs.com/shadoll/p/14481963.html
简介
override意思是重写。它是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同,用于拓展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现,提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。
例子
override重写抽象方法。
public abstract class A
{
public abstract void Func();
}
public class B : A
{
public override void Func()
{
Console.WriteLine("B");
}
}
override重写虚方法。
public class A
{
public virtual void Func()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void Func()
{
Console.WriteLine("B");
}
}
4.静态类
静态类:
在类(class)上加入static修饰, 表示该类无法被实例化,并且该类中,无法实例化变量或函数。
那么如果要在此静态类中添加函数、变量、属性,则必须都是静态的。
静态类的主要特性:
1:仅包含静态成员。
2:无法实例化。
3:静态类的本质,是一个抽象的密封类,所以不能被继承,也不能被实例化。
4:不能包含实例构造函数。
5:如果一个类下面的所有成员,都需要被共享,那么可以把这个类定义为静态类。
所以,可以在普通类中添加静态方法,但是静态类中的方法、变量都必须是静态的。
5. Lock()关键字
为了避免多个线程同时操作同一资源,引起数据错误,通常我们会将这个资源加上锁,这样在同一时间只能有一个线程操作资源。
避免锁定 public 类型,否则实例将超出代码的控制范围。
lock 的目的很明确:就是不想让别人使用这段代码,体现在多线程情况下,只允许当前线程执行该代码区域,其他线程等待直到该线程执行结束;这样可以多线程避免同时使用某一方法造成数据混乱。
关键代码:
private object o = new object();//创建一个对象
public void Work()
{
lock(o)//锁住这个对象
{
//做一些必须按照顺序做的事情
}
}
实例:
private SerialPort Rs232;
public override void TurnOn(int brightType)
{
lock (Rs232)
{
switch (brightType)
{
case 1: SetBright(GetBrightness(1)); break;
case 2: SetBright(GetBrightness(2)); break;
case 3: SetBright(GetBrightness(3)); break;
default: break;
}
ActiveTime = DateTime.Now;
}
}
所以,使用lock应该注意以下几点:
1、如果一个类的实例是public的,最好不要lock(this)。因为使用你的类的人也许不知道你用了lock,如果他new了一个实例,并且对这个实例上锁,就很容易造成死锁。
2、如果MyType是public的,不要lock(typeof(MyType))。
3、永远也不要lock一个字符串。
6.C# List.Where()和List.Select()
作用:
List.Where()用于筛选数据
List.Select()用于选择数据
用法:
List.Where(x=>x.namedata.name && x.agedata.age).ToList();
筛选出List中name=data.name和age==data.age的集合
List.Select(x=> new{x.name,x.age}).ToList();
集合中只有name和age两列
实例:
public class SvLightBase {....}//类
private List<SvLightBase> Items = new List<SvLightBase>();
public SvLightBase this[int index] { get => Items[index]; }
索引器的使用是public 类型 this[int index]{get{};set{}} ,访问通过类的实例(对象)加[i],例如animal[i],就像访问数组一样,其实就是类的数组访问的使用书写。
public SvLightBase this[string key] { get => Items.Where(x => x.Name == key).FirstOrDefault(); }
Items.Select(x => x.Name).ToList();
C#中List.ForEach 方法是对 List 的每个元素执行指定操作。
Items.ForEach(x => x.Initial());//Initial()方法
例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppExample
{
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
numbers.Add(4);
numbers.Add(5);
numbers.Add(6);
//numbers.ForEach(Display);
//numbers.ForEach(number =>
//{
// Console.WriteLine(number);
//});
numbers.ForEach(delegate(int number)
{
Console.WriteLine(number);
});
}
static void Display(int number)
{
Console.WriteLine(number);
}
}
}
结语:本篇文章主要记录抽象类、虚拟方法、重写、lock关键字、List.Where()和List.Select()的用法。