C#中的一些基本方式总结

2023-10-31

目录

1.委托delegate---c#中的将方法作为参数传递

2.堆和栈

3.override重写

4.new关键字,如果子类声明了和父类同样的方法,但用new声明了,会隐藏掉父类的方法。

5this和base

6.sealed类

7.泛型方法

8.泛型类型约束

9特性

10.开启线程

11.socket服务端

12 设计原则



1.委托delegate---c#中的将方法作为参数传递

   1.自定义委托

        //1、声明委托类型
        public delegate void SumDelegate(int a, int b);
        //2、有一个方法包含了执行的代码
        public static void Sum1(int a, int b)
        {
            Console.WriteLine(a + b);
        }
        static void Main(string[] args)
        {
            //3、创建委托实例,使用了new 关键字,说明委托也是类,将方法名Add作为参数绑定到该委托实例             
            var sum = new SumDelegate(Sum1);
            //4、调用委托实例             
            sum(1, 2);
           
        }


       // 3匿名方法调用
      static void Main(string[] args)
        {
            SumDelegate sum = delegate(int a, int b) { Console.WriteLine(a + b); };
            sum(1,2);
           
        }

    2.内置的无返回值委托

   void b(int i)

   Action<int,int> a=b;// 系统字定义的委托类型,方法为b ,参数为int ,int ,没有返回值

   b(i)

   3.内置的右返回值得委托

  Func<string,int> a =b // 系统字定义的委托类型,方法为b ,参数为string ,返回值为int

  Func<int,int> plus=delegate(int a,int b)

  {return a+b;} 
   或者

   Func<int,int> plus=(a,b)=>{return a+b;}

   4.多播委托

   Action a=Test1;

   a+=c;// 新增一个委托

   a-=Test1// 减少一个委托

  调用委托变量会按照次序依次调用

   遍历多播委托中的方法

   Delegate[] c=a.GetInvocationList()

  5.event事件订阅观察者模式

一个特殊的委托,本质上就是多播委托

    public delegate void SumDelegate(int a, int b);

在类中声明事件,事件是对象的成员,new出来就行

   public event SumDelegate attackevent;

2.堆和栈

堆空间大,但是速度慢

引用类型的数据
空间大,速度慢
C#中String类是内置的引用类型数据
指针会指向堆中的数据,本身结构是不规则排列的

空间小,速度快
存放的数据是值类型(整数,bool,struct char 小数)和引用类型的引用
便于理解可以看做是保存着我们代码执行的步骤,当我们使用完一个就从栈顶去掉一个,因此本身是不需要我们清理的

3.override重写

主要用于在派生类中重写方法覆盖基类,

1.在基类中需要对同一方法进行virtual声明,如果在派生类中没有用override重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法

2.abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现基类为抽象类,方法也为抽象方法

4.new关键字,如果子类声明了和父类同样的方法,但用new声明了,会隐藏掉父类的方法。

    public new void Move()//

5this和base

public Derive:base()// 子类构造函数

6.sealed类

 允许类从基类继承,以及防止它们重写特定的虚方法或虚属性。

7.泛型方法

public static T GetSum<T,B>(T a,T b){

return a+""+b;}

GetSum<int,int>(23,12);GetSum<double,int>(23.2,12)

泛型类

class ClassA<T,A>{

private T a;

private A c;

}

8.泛型类型约束

where T : struct                               | T必须是一个结构类型
where T : class                                 | T必须是一个Class类型
where T : new()                               | T必须要有一个无参构造函数
where T : NameOfBaseClass              | T必须继承名为NameOfBaseClass的类
where T : NameOfInterface               | T必须实现名为NameOfInterface的接口

 public sealed partial class  ZeneralDataAccess<T> where T : class
    {}

9特性

[Obsolete("该方法已被弃用")]// 表示一个方法被弃用了

[Conditional(isTest)]//判断isTest是否被定义

[DebuggerStepThrough]//跳过断点

   CallerFilePath 获取调用该方法的文件路径
   CallerLineNumber 获取调用该方法的源文件的行号
   CallerMemberName 获取调用该方法的方法名
static void Print(string str, [CallerFilePath]string file = "",
 [CallerLineNumber]int line = 0, [CallerMemberName]string method = "")
   { }

自定义特性

1.使用【MyTest("此方法已注释")】会调用MyTestAttribute类的构造方法

如果想获取特性类的值,可以通过反射获取信息 

10.开启线程

Task 类 (System.Threading.Tasks) | Microsoft Docs

    1.异步开启线程

// 1.通过委托,开启一个线程
Func<int,string,int> a=Test
// 开启一个线程去执行a所引用的方法,倒数第二个参数表示回调函数,就是当线程结束的时候回调用这个委托指向的方法,
倒数第一个参数用来给回调函数传递数据,用回调不会阻碍主线程的调用,如果返回值写在主线程里,是会挂起主线程,直到子线程执行完毕。
IAsyncResult ar=a.BeginInvoke(100,'siki',OnCallBack,null)
// 判断当前线程是否已执行完毕
while(ar.IsCompleted==false)
//检测线程结束,1000毫秒表示超时时间,如果等待了1000毫秒线程还没结束,方法返回false,否则返回true
bool isEnd=ar.AsyncWaitHandle.WaitOne(1000);
// 获得异步线程的返回值
int res=a.EndInvoke(ar);



static void OnCallBack(IAsyncResult ar){

Func<int,string,int> a=ar.AsyncState as Func<int,string,int>;
int res=a.EndInvoke(ar);
}


// 使用lam表达式
a.BeginInvoke(100,"siki",ar=>{
     int res=a.EndInvoke(ar);
},null)

  2.Thread开启线程

Thread t=new Thread(方法)// 这个是前台线程

t.IsBackground=true;//设置为后台线程,如果前台进程结束,后台进程也结束了。如果后台进程结束,不会影响前台进程

t.Start("参数")

t.Abort();//终止这个线程的执行

t.Join();//当前线程睡眠,等待t线程执行完,然后继续运行下面的代码

3.线程池

线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,
如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,
而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,
系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性。

线程池中的线程都是后台线程。
不能给入池的线程设置优先级或名称。
入池的线程只能用于时间较短的任务。如果线程要一直运行(比如Word的拼写检查线程),就应该使用Thread类创建一个线程

  1.添加线程

       ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));

        或

     ThreadPool.QueueUserWorkItem(new WaitCallback(方法名), 参数);

  2.ThreadPool.SetMaxThreads(workerThreads, portThreads);// 设置线程池中的线程方法

4.任务

     任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制.在我的理解里,任务跟线程应该差不多,但是按照这个理解,应该也是有一个缓存队列来执行的(先保留疑点)

 //第一种创建方式,直接实例化:必须手动去Start
   var task1 = new Task(() =>
    {
     
    });
   task1.Start();

//第二种创建方式,工厂创建,直接执行
   var task2 = Task.Factory.StartNew(() =>
    {
     
    });

11.socket服务端

socket不是协议,是是位于应用层和传输控制层之间的一组接口,是为了实现tcp和udp特意分离的一组接口。

网络通信三要素
IP地址:网络上主机设备的唯一标识
端口号: 有效端口:0~65535,其中0~1024由系统使用,开发中一般使用1024以上端口.
传输协议:TCP,UDP
1.TCP(面向连接,提供可靠的服务)

2.udp(无连接,传输速度快)

TcpListener

UdpListener

NetworkStream 

12 设计原则

1.单一职责原则

2.开闭原则(Open-Closed Principle)(接口)

3.里氏代替原则(指的是子类必须替换掉它们的父类型)

4.依赖倒置原则(面向接口编程,而不是面向实现编程)

5.接口隔离原则(使用多个专门的接口比使用单一的总接口要好)

6.合成复用原则

7.迪米特法则(一个模块或对象应尽量少的与其他实体之间发生相互作用)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中的一些基本方式总结 的相关文章

随机推荐

  • PAT : 基础编程题目集_编程题答案(7-1 ~ 7-38)(纯C编写)

    题目地址 7 1 include
  • Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

    Syntax Error Error vitejs plugin vue requires vue gt 3 2 13 or vue compiler sfc to be present in the dependency tree 第一步
  • 使用scrapy和selenium结合爬取网易新闻内容

    代码结构 相关文件的代码 爬虫文件 mid py 爬虫文件 import scrapy from middle items import MiddleItem from selenium import webdriver class Mid
  • 欧拉降幂公式

    欧拉降幂公式 a b a b equiv ab a b
  • CVE-2022-24112 Apache APISIX 命令执行漏洞复现

    CVE 2022 24112 Apache APISIX 命令执行漏洞 Apache APISIX 是 Apache 软件基金会下的云原生 API 网关 它兼具动态 实时 高性能等特点 提供了负载均衡 动态上游 灰度发布 金丝雀发布 服务熔
  • 如何去编写一个C++程序

    如何去编写一个C 程序 1 防卫式声明 2 写class的头 3 考虑复数准备什么数据 4 考虑复数准备哪些函数 5 类外定义函数 成员函数 6 类外定义函数 非成员函数即全局函数 7 调用函数 学习侯捷老师讲授课程C 面向对象高级开发 总
  • 在浏览器中输入URL中会发生什么

    面试官问 在浏览器中输入URL中会发生什么 我们首先分析下这个问题 这是一个很宽泛 细节非常非常多的一个问题 如果要展开来细说我们可以直接从应用层的协议 讲到传输层 网络层 再到数据链路层 可是我们这里不建议大家一开始就深挖协议中的细节 原
  • Unity 视频播放

    Unity 视频播放 前言 在Unity引擎做视频播放的方式有很多种 这里介绍两种 一种是使用RawImage组件的纹理进行视频播放 将视频每一帧的画面复制在RawImage的纹理贴图中 实现视频的播放展示 另外一种是使用插件Av Pro进
  • node.js系统学习4-sync&&async

    async异步 sync同步 阻塞 非阻塞 https www runoob com nodejs nodejs callback html
  • PASCAL VOC 2012 数据集解析

    目录 一 Introduction Classification Detection Competitions Segmentation Competition Action Classification Competition Image
  • IDEA创建第一个spring boot项目提示cannot resolve xxx等错误

    在学习spring boot课程 精通spring boot 42讲 时 根据课程安装好maven和jdk之后 准备开始使用IDEA创建第一个spring boot项目 使用插件spring assistant创建好项目之后 却发现包org
  • python爬虫时报错

    我用的是Python3 66版本 最近写了一段爬虫代码 在DEBUFG模式运行时没有报错 但是普通模式运行时就报下面这个错误 wrap socket argument 1 must be socket socket not SSLSocke
  • (附源码)springboot垃圾自动分类管理系统 毕业设计 160846

    摘 要 随着现在网络的快速发展 网络的应用在各行各业当中它很快融入到了许多分类管理之中 他们利用网络来做这个垃圾自动分类的网站 随之就产生了 垃圾自动分类管理系统 这样就让垃圾自动分类管理系统更加方便简单 对于本垃圾自动分类管理系统的设计来
  • Matlab绘图?学会一招就够了——源代码

    hello 欢迎来到我的博客 你应该是b站来的小伙伴吧 谢谢你的关注 这篇博客的内容是以下这个视频的源代码 Matlab绘图 学会一招就够了 代码如下 clc clear all close all 生成图窗 clc 清楚command窗口
  • 双向卷积神经网络_基于双向特征融合卷积神经网络的液晶面板缺陷检测算法

    基于双向特征融合卷积神经网络的液晶面板缺陷检测算法 彭大芹 刘恒 许国良 邓柯 摘 要 摘要 针对手机液晶面板生产工业中缺陷检测面临的精度低的问题 提 出了一种基于深度学习的液晶面板缺陷检测算法 该算法在传统单向特征融合 的基础上提出了双向
  • Windows上运行Caffe自带的mnist例子

    环境要求 win10 VS2013 CUDA7 5 Caffe的windows版下载地址 https github com Microsoft caffe 配置Caffe工程 1 将Caffe源码的windows目录下CommonSetti
  • 第十三届蓝桥杯大赛软件赛决赛(Java 大学A组)

    蓝桥杯 2022年国赛真题 Java 大学A组 试题 A 火柴棒数字 试题 B 小蓝与钥匙 试题 C 内存空间 试题 D 斐波那契数组 试题 E 交通信号 试题 F 数组个数 试题 G 六六大顺 试题 H 选素数 试题 I 图书借阅 试题
  • GFS浅谈

    GFS Google File System Big Table Map Reduce作为google的三宝技术 是Google诸多服务的基石 我想就自己的理解对GFS文件系统作一个分析 GFS首先是属于分布文件系统 但作为Google公司
  • PAT C入门题目练习-7-90 螺旋方阵 (20 分)

    7 90 螺旋方阵 20 分 所谓 螺旋方阵 是指对任意给定的N 将1到N N的数字从左上角第1个格子开始 按顺时针螺旋方向顺序填入N N的方阵里 本题要求构造这样的螺旋方阵 输入格式 输入在一行中给出一个正整数N lt 10 输出格式 输
  • C#中的一些基本方式总结

    目录 1 委托delegate c 中的将方法作为参数传递 2 堆和栈 3 override重写 4 new关键字 如果子类声明了和父类同样的方法 但用new声明了 会隐藏掉父类的方法 5this和base 6 sealed类 7 泛型方法