C#不常用方法笔记

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()的用法。

猜你喜欢

转载自blog.csdn.net/qq_42711010/article/details/129317284