当前位置: 首页 > news >正文

C#初阶概念理解

​​​​​​​

梳理了一些本人在学习C#时的一些生疏点,同时也加深自己的印象。

堆&栈

堆用来存储程序运行时产生的变量,当程序结束时释放;

栈用来存储程序运行时,调用方法产生的临时变量,方法运行完成后就会释放掉;

引用类型&值类型

值类型

 以下代码,在将a的值存储进b时,是将a里面的数值复制,放入b中。

//值类型
int a = 18;
int b = a;

原来a的值改变后,不影响b。

引用类型

引用类型有点不一样,观察下面的代码,将变量xiaoming赋值给xiaogang后,对小明的Name属性修改,我们查看输出结果,发现xiaogang的Name属性也被修改了。

namespace ConsoleApp1
{public class Program{static void Main(string[] args){//创建一个学生对象Student xiaoming = new();//小明的年龄是18xiaoming.Age = 18;//名字叫王小明xiaoming.Name = "王小明";//这时把小明的信息赋值给小刚Student xiaogang = xiaoming;//过了一年,小明长大了,叫‘王大明’xiaoming.Name = "王大明";//这个时候查看小刚的名字Console.Write(xiaogang.Name);//结果打印王大明}}public class Student{/// <summary>/// 学生的年龄/// </summary>public int Age;/// <summary>/// 学生的名字/// </summary>public string Name { get; set; }}
}

之所以叫引用类型,其实xiaoming和xiaogang都是引用同一块内存地址,

同样,如果我们对xiaogang的Name进行修改,再查看xiaoming的Name属性,也会变成对xiaogang的更改。

继承

观察下方代码,继承父类后,子类也将拥有父类的变量、方法。

前提是父类在创建时不是私有变量或方法。

    class Father{//需要声明public,子类才能调用public int BigHouse = 10;double Dollars = 1000000;string Skill = "搬砖,熬夜";}/// <summary>/// 继承父类,让父类变成共同财产/// </summary>class Son:Father{public void Ability(){Console.WriteLine($"我生下来就有{BigHouse}套房子");}}

接口

观察下方代码,首先声明了接口:回家方式   

每个人的回家方式是不同的,就要到各自的类中去实现,比如小明开车回家,小刚开武装直升机回家,等类似的接口

比如游戏中的怪物都会攻击,但不同的怪物有不同的攻击方式,就要各自去实现。

继承接口,在标准化编程中可以更稳妥,防止一些功能未实现导致的Bug。

    /// <summary>/// 声明回家的方式/// </summary>interface GoHome{/// <summary>/// 交通工具接口,但每个人的交通工具不一样/// </summary>/// <param name="Vehicle_Type"></param>public void Vehicle(string Vehicle_Type);}class xiaoming : GoHome{/// <summary>/// xiaoming的回家方式/// </summary>/// <param name="Vehicle_Type"></param>void GoHome.Vehicle(string Vehicle_Type){Console.WriteLine($"xiaoming今天开{Vehicle_Type},回家");}public int Age = 18;}class xiaogang : GoHome{/// <summary>/// xiaogang的回家方式/// </summary>/// <param name="Vehicle_Type"></param>void GoHome.Vehicle(string Vehicle_Type){Console.WriteLine("呼叫管家");Console.WriteLine($"管家开着xiaogang的私人{Vehicle_Type}接少爷回家");}}

多态

方法的重载

像我们使用的Console.Writeline之所以可以传入多种不同类型、不同长度的形参,是因为将同一方法写了几十种处理方式。

观察下方代码,发现买几本书,就对应一种方法,把一个方法可能碰到的情况都写出来,会让你的代码更灵活更健壮。

要注意,每个重载必须形参不同,如果写两个方法形参一样、方法体不一样,系统无法分辨你要使用哪一个。

    class Polymorphic{/// <summary>/// 买一本书/// </summary>/// <param name="book"></param>/// <returns></returns>public static List<string> GetBook(string book){List<string> list = new List<string>();list.Add(book);return list;}/// <summary>/// 买两本书/// </summary>/// <param name="book"></param>/// <param name="book1"></param>/// <returns></returns>public static List<string> GetBook(string book, string book1){List<string> list = new List<string>();list.Add(book);list.Add(book1);return list;}/// <summary>/// 买三本书/// </summary>/// <param name="book"></param>/// <param name="book1"></param>/// <param name="book2"></param>/// <returns></returns>public static List<string> GetBook(string book, string book1, string book2){List<string> list = new List<string>();list.Add(book);list.Add(book1);list.Add(book2);return list;}}

重写

可在原来写好的方法上,不修改原来方法,进行功能扩展。

    /// <summary>/// 画画/// </summary>class Drawing{//virtual 表明可被重写,重写可理解为在原来的基础上进行添砖加瓦。public virtual void DrawingLine(string name){Console.WriteLine(name);Console.WriteLine("-----------------");}}/// <summary>/// 必须继承才能重写,重写不影响原方法。/// </summary>class StudyDrawing : Drawing{/// <summary>/// 重写方法时需用 override 修饰,原方法需表明可被重写 virtual/// </summary>/// <param name="name"></param>public override void DrawingLine(string name){Console.WriteLine("正在画一只宠物");//重写过程中可调用旧方法base.DrawingLine(name);}}

泛型

其实我们在创建列表时,就是一个泛型应用。

在尖括号中填入数据类型,列表就只能存入指定的数据类型,有约束作用

List<int> list = new List<int>();

泛型方法、变量

可以不提前指定数据类型,但是在编写逻辑时会碰到各种问题,需要经验丰富才能写的下去,我尝试几次后就放弃了,暂时用不到,等有需求再深入研究。

有兴趣可以参考菜鸟教程

特性

不懂

反射

不懂

预处理器

不懂

委托

不懂

改变自己是神,改变别人是XXX!

http://www.lryc.cn/news/495528.html

相关文章:

  • node.js基础学习-url模块-url地址处理(二)
  • 算法与数据结构(1)
  • FTP介绍与配置
  • SQL面试题——抖音SQL面试题 最近一笔有效订单
  • 【线程】Java多线程代码案例(1)
  • go使用mysql实现增删改查操作
  • 【Rust】unsafe rust入门
  • dpwwn02靶场
  • K8S疑难概念理解——Pod,应该以哪种Kind来部署应用,为什么不直接Pod这种kind?
  • LabVIEW进行仪器串行通信与模拟信号采集的比较
  • D81【 python 接口自动化学习】- python基础之HTTP
  • 白鹿 Hands-on:消除冷启动——基于 Amazon Lambda SnapStart 轻松打造 Serverless Web 应用(二)
  • ROC曲线
  • c++ 位图和布隆过滤器
  • 阿里云CPU过载的一点思考
  • 单片机学习笔记 15. 串口通信(理论)
  • 算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
  • Linux history 命令详解
  • Kafka知识体系
  • 【Android】EventBus的使用及源码分析
  • 【大数据学习 | Spark调优篇】Spark之内存调优
  • Linux:文件系统inode
  • 力扣难题解析
  • 4.5-Channel 和 Flow:SharedFlow 和 StateFlow
  • Qt | TCP服务器实现QTcpServer,使用线程管理客户端套接字
  • 【提高篇】3.6 GPIO(六,寄存器介绍,下)
  • 【AI】数据,算力,算法和应用(3)
  • 深度学习笔记——生成对抗网络GAN
  • 网络安全开源组件
  • Python毕业设计选题:基于django+vue的智慧社区可视化平台的设计与实现+spider