C#入门与精通

C#精通

本文章主要是对于学习C#基础难点进行学习以及与java语言的不同点,详细学习可见官网:https://dotnet.microsoft.com/en-us/learn


文章目录

  • C#精通
  • VS
    • VS基本设置
  • C#是什么
  • C#程序
    • 控制台输出
    • 变量内插
    • 占位符
    • C#foreach循环
    • 类型转换
    • 操作数组
    • 内置方法
    • 格式设置
    • 方法
    • 复杂类型
      • 枚举类型
  • 飞行棋小项目
  • 面向对象
    • 属性
    • 构造函数,this关键字
    • 析构函数
    • 命名空间
      • 引用其他项目
    • 值类型和引用类型
    • 构造方法
    • 里氏转换
    • 集合
      • 数组和集合的转换
      • Hashtable
      • 字典(Dictionary)
    • File
      • Directroy(文件夹操作类)
      • Path(文件路径操作类)
      • 读写数据
    • 文件流
      • FileStream(字节操作)
      • StreaReader和StreamWriter
    • 多态实现形式
      • 虚方法
      • 抽象类
    • 序列化和反序列化
    • 密封部分类
    • MD5加密


VS

  • 安装VS,目录:解决方案>项目>类 可在方案中创建多个项目。

VS基本设置

  • 生成->生成解决方案 可排查错误
  • 工具->选项 可设置字体,行号
  • vs默认启动第一项目,右击解决方案->属性可自选
  • 快捷键

    ctrl+k+d:快速对齐 ctrl+j:提示 shift+alt+f10:生成解决方案 ctrl+alt+x:打开工具箱

  • 折叠代码
    在这里插入图片描述

C#是什么

C#(发音为 “C Sharp”)是一种现代、面向对象的、类型安全的编程语言,由微软开发,首次发布于2000年。C#的设计者是Anders Hejlsberg,他也是Turbo Pascal和Delphi的创造者。C#结合了C++的强大特性和Visual Basic的易用性,旨在提供一种新的编程语言,以适应.NET框架的需要。

语法和Java很类似


C#程序

控制台输出

每个语言都有控制台输出,如java中的println

> 逐字字符串文本将保留所有空格和字符,而无需转义反斜杠。 
要创建逐字字符串,请在文本字符串的前面使用 @ 指令。
```java
C# 不换行输出Console.Write()换行输出Console.WriteLine()
如需原封不动输出Console.Write(@"hsfdsj dfjkslfjdsklf    kdfj \\\ n ");
```
  • Console.ReadKey();等待用户按下任意键 参数为true不显示控制台
  • Console.ReadLine();接受用户输入 相当于java new Scanner(System…).next()
  • 控制台前景色:Console.ForegroundColor = ConsoleColor.Red;
  • Console.Clear():清空控制台

变量内插

若要将两个字符串内插在一起,请创建一个文本字符串,并在字符串前面加上 $ 符号。 文本字符串应包含至少一组大括号 {},且你会在这些字符内使用变量的名称。

```javapublic static void test2(){var firstName = "张三";String a = $"hello {firstName}";Console.Write($"{a}");}
```
`@和$可联合使用````javapublic static void test2(){var firstName = "张三";String a = @$"hello {firstName}豆瓣    111";Console.Write($"{a}");}
```

占位符

Console.WriteLine(“{0}sdlfsjlf”,变量);变量可占据0这个位置,多个变量,只需要增加数值就行。

C#foreach循环

```javaforeach(String s in str){if (s.StartsWith("B")){Console.WriteLine($"嫌疑{s}");}}//java  for(String s : str){}
```

类型转换

使用 Convert.ToInt32() 进行转换时,文本浮点数值将正确地向上舍入到 2。 如果你将文本值更改为 1.499m,则会向下舍入到 1。

			int atos = 11;String num = "22";String f = "1";int res1 = int.Parse(num)*atos;String res2 = Convert.ToString(atos);Console.WriteLine(@$"类型:{res1.GetType().Name}   值:{res1}"); Console.WriteLine(@$"类型:{res2.GetType().Name}   值:{res2}");Console.WriteLine(Convert.ToInt32(1.5f));
//类型:Int32   值:242
//类型:String  值:11
//2
  • 判断转换
    对于字符串转换成int类型,如不是数值问题就会转换失败,我们可以使用TryParse()来判断
    out 参数提供了返回值的方法的辅助手段。 在这种情况下,out 参数返回转换后的值

    public static void test1(){String str1 = "11ab";String str2 = "22";int result = 0;if (int.TryParse(str2,out result)){Console.WriteLine("转换成功==》" + result);}else{Console.WriteLine("转换失败");}}
    

操作数组

  • 数组

    Array.sort();//排序  
    Array.reverse();//反转
    Array.clear();//删除
    Array.resize();//改变大小
    ...
    这些方法和java个别是有差异的
    

内置方法

在这里插入图片描述

  • indexof() ,LastIndexOf(),IndexOfAny()
  • remove(),replace()

格式设置

在这里插入图片描述

方法

  • out参数

    当一个方法需要返回多个不同类型的返回值时,可以使用out作为返回参数。一旦定义了out返回参数,就需要在方法内赋值。方法外需要定义接受,名字可不同。

    static void Main(string[] args){int[] nums = { 4, 2, 1, 9 };string name1;nums = getNumsRef(nums, out name1);Console.WriteLine(name1);Console.WriteLine($"最大值={nums[1]},最小值={nums[0]}");}/// <summary>/// out 参数练习/// </summary>/// <param name="nums">数组</param>/// <param name="name">返回参数</param>/// <returns>求最大值,最小值</returns>public static int[] getNumsRef(int[] nums, out string name){name = "返回最大最小的方法名";Array.Sort(nums);int[] refs = new int[2];refs[0] = nums[0];refs[1] = nums[nums.Length-1];return refs;}
    
  • ref 参数

    引用外部变量,可以将外部变量带入方法内部,然后再带出方法外部。要求方法外部必须定义赋值

      static void Main(string[] args){int num = 10;addMoney(ref num);Console.WriteLine(@"加完之后的值:{0}",num);//110}public static void addMoney(ref int num){num += 100;}
    
  • 命名参数:生命参数,以改变参数位置

     public static void test6(){method1(age:11,name: "zhangsan");}public static void method1(String name,int age){Console.WriteLine($"名字:{name},年龄:{age}");}
    
  • 可变参数params

    一个方法参数列表中只能出现一个可变参数,用户接受多个参数封装到一个数组中,且可变参数的位置必须是最后,才不会出现歧义。

    static void Main(string[] args){countArrNum("长度", 3, 4, 56, 10);}public static void countArrNum(string name,params int[] num){Console.WriteLine(name+"->"+num.Length);}
    
  • 声明参数:初始化参数值

    public static void test6(){method1("lishi222");}public static void method1(String name="lisi",int age=1){Console.WriteLine($"名字:{name},年龄:{age}");}
    

复杂类型

  • const 修饰 是常量

枚举类型

  • 枚举类型转换成int

    namespace Test2
    {public enum SEASON{spring,summer=5,autumn,winter}class Program{static void Main(string[] args){#region  枚举类型转换成intSEASON s1 = SEASON.autumn;Console.WriteLine((int)s1);#endregion}}
    }
    
  • int转换成枚举
    在这里插入图片描述

  • string转成成枚举

在这里插入图片描述

飞行棋小项目

  • 飞行棋小项目 中的FlyGame项目

面向对象

属性

  • get和set方法简写

    namespace _2024_0719_Project
    {class Person{private string _name;//字段private int _age;public string Name//属性{get { return _name; }set { _name = value; }}public int Age{get { return _age; }set { _age = value; }}public void speak(){Console.WriteLine("my name is {0},my age is {1}", this.Name, this.Age);}}
    }
    

    c#中age为字段,Age为属性,当调用属性时会调用里面的get,set方法。

      static void Main(string[] args){Person p = new Person();p.Age = 11;p.Name = "zhangsan";p.speak();  //my name is zhangsan,my age is 11   }
    

构造函数,this关键字

一个类是有默认的构造函数,如果你在类中定义了构造函数,则默认的构造函数 就不复存在。构造函数调用本类的构造函数可以使用this关键字

class Student{private string name;//main函数调用这个构造方法Student s = new Student("李四");public Student(string name):this("张三",11){this.Name = name;Console.WriteLine("名字: {0} 年龄: {1}",Name,Age);//名字: 李四 年龄: 11}private int age;public Student(string name,int age){this.Name = name;this.Age = age;}public Student(){}public string Name { get => name; set => name = value; }public int Age { get => age; set => age = value; }}

可以看到,先执行this的构造函数,然后执行本构造函数

析构函数

析构函数程序结束执行,类中定义如下

     ~Student(){Console.WriteLine("我是析构函数");Console.ReadKey();}

命名空间

引用其他项目

  • 引用其他项目:1.在项目依赖项中右击,选择添加项目引用 2.使用using 命名空间

值类型和引用类型

值类型:int double decimal struct enum…
引用:数组 类 string
在这里插入图片描述

构造方法

  • 子类继承父类 : 子类:父类

  • 子类继承不了父类的私有

  • 子类继承父类,可以访问父类的共有的属性,字段,方法 当调用子类的无参构造方法,首先是创建父类,调用父类的构造方法(如果父类中定义了有参构造方法,则必须定义父类无参构造方法以便创建)子类为什么能访问父类的方法,肯定是提前创建了父类对象。

        class Program{static void Main(string[] args){Stu stu = new Stu("张三", 11);stu.CommonWalk();Console.WriteLine(stu.Name);}}public class Person{private string personName;private string name;public int age;public Person(string name, int age){this.name = name;this.age = age;}public int Age { get => age; set => age = value; }public string Name { get => name; set => name = value; }public void CommonWalk(){Console.WriteLine("通用方法");Console.ReadKey();}}//继承public class Stu : Person{private string name;public int age;//显示调用父类有参构造方法创建父类对象public Stu(string name, int age) : base(name, age){}public string Name1 { get => name; set => name = value; }}
    

    控制台打印:
    通用方法
    张三

里氏转换

  • 子类可以赋值给父类;父类可以强转成其子类;

  • is 关键字判断是否是此类型

        static void Main(string[] args){Person[] person = new Person[2];person[0] = new Stu();if(person[0] is Stu){person[0].pSpeak();//父类只可以调用自己的Stu stu = (Stu)person[0];stu.stuSpeak();}}
    

集合

  • Add 添加单个 AddRange添加多个
  • Clear清空所有元素 Remove 删除单个 RemoveAt根据下标删除 RemoveRange:根据下标移除范围内的元素
  • Sort 比较排序 Rerverse 反转
  • Insert:在指定位置插入元素 InsertRange
  • Contains 判断是否包含
  • count 实际包含长度 capacity 可包含长度

数组和集合的转换

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;namespace _5_Project
{class Program{static void Main(string[] args){List<int> list = new List<int>();list.Add(1);list.Add(2);int[] arr = list.ToArray();//list  转数组list = arr.ToList();//数组转listforeach (var de in list){Console.Write(de + "  ");}}}
}

Hashtable

 Hashtable hashtable = new Hashtable();hashtable.Add(1, "张三");hashtable.Add(false, "李四");foreach(var key in hashtable.Keys){Console.WriteLine($@"key:{key}         value {hashtable[key]}");}

字典(Dictionary)

  • 适合定义泛型

     static void Main(string[] args){Dictionary<int, string> dic = new Dictionary<int, string>();dic.Add(1, "张撒");dic.Add(2, "李四");foreach (KeyValuePair<int,string> kv in dic){Console.WriteLine(@$"键---{kv.Key},值---{kv.Value}");}}
    

File

Directroy(文件夹操作类)

  • CreateDirectory:创建文件夹
  • Delete:删除文件夹
  • Move:剪切文件夹
  • GetFiles:获取指定文件下所有文件的全路径,重载可筛选文件*.jpg
  • Exist:判断文件夹是否存在

Path(文件路径操作类)

 static void Main(string[] args){string p = @"D:\周报\周周报.xlsx";Console.WriteLine("文件名包括扩展    {0}",Path.GetFileName(p));Console.WriteLine("文件名不包括扩展    {0}", Path.GetFileNameWithoutExtension(p));Console.WriteLine("获取扩展名    {0}", Path.GetExtension(p));Console.WriteLine("获取文件所在文件夹    {0}", Path.GetDirectoryName(p));Console.WriteLine("获取全路径    {0}", Path.GetFullPath(p));}

在这里插入图片描述

  • File.Create File.Delete File.Copy File.Move … 网上搜相关方法

读写数据

  • 读 ReadAllBytes:有注释
    在这里插入图片描述

  • 写:WriteAllBytes

       //获取字符串的字节byte[] buff = Encoding.GetEncoding("UTF-8").GetBytes("你好酒店房间打开,d");File.WriteAllBytes(@"E:\测试\a.txt",buff);//写入指定路径Console.WriteLine("写入成功");
    

File还有很多好用的方法,可查API

文件流

File由于是一次操作文件,对性能消耗比较大

FileStream(字节操作)

//创建流,打开或创建,可读权限FileStream fileStream = new FileStream(@"E:\测试\aa.txt",FileMode.OpenOrCreate,FileAccess.Read);byte[] buff = new byte[1024];int r = fileStream.Read(buff,0,buff.Length);//返回读到的位置,读多少个string msg = Encoding.GetEncoding("UTF-8").GetString(buff, 0, r);//关闭fileStream.Close();fileStream.Dispose();Console.WriteLine(msg);
//写//using框架会帮我们自动关闭流资源using (FileStream fileStream1 = new FileStream(@"E:\测试\aa.txt", FileMode.Append, FileAccess.Write)){byte[] buff1 = Encoding.UTF8.GetBytes("我是写入的数据");fileStream1.Write(buff1, 0, buff1.Length);Console.WriteLine("写入成功");}

StreaReader和StreamWriter

//读using (StreamReader streamReader = new StreamReader(@"E:\测试\aa.txt", Encoding.UTF8)){while (!streamReader.EndOfStream){string str = streamReader.ReadLine();Console.WriteLine(str);}}

   //写,true为追加using (StreamWriter streamWriter = new StreamWriter(@"E:\测试\b.txt",true)){streamWriter.WriteLine("这是我写的");Console.WriteLine("写完了");}

多态实现形式

虚方法

在子类要重写的方法的父类中用virtual关键字修饰,子类的方法用override修饰

using System;namespace _9_Project
{class Program{static void Main(string[] args){Person p1 = new Stu();p1.speak();//可以看到这里不调用父类的方法,而是子类的}}class Person{public virtual void speak(){Console.WriteLine("我是人类");}}class Stu : Person{public override void speak(){Console.WriteLine("我是子类学生");}}
}

抽象类

序列化和反序列化

  • 在类的上一行[Serializable] 表示可序列化

     //序列化Person p = new Person("张三",11);using (FileStream writer =new FileStream(@"E:\测试\c.txt",FileMode.OpenOrCreate,FileAccess.Write)){BinaryFormatter binaryFormat = new BinaryFormatter();binaryFormat.Serialize(writer, p);}//反序列化using(FileStream reader = new FileStream(@"E:\测试\c.txt", FileMode.OpenOrCreate, FileAccess.Read)){BinaryFormatter binaryFormat = new BinaryFormatter();Person p2 = (Person)binaryFormat.Deserialize(reader);Console.WriteLine($@"名字=》{p2.Name}     年龄=>{p2.Age}");}
    

密封部分类

  • 使用sealed修饰类,表示此类不可被继承
  • 使用partial修饰类,表示此类是部分类,几个部分类共享彼此的数据

MD5加密

  static void Main(string[] args){MD5 md5 = MD5.Create();String str = "我是加密的字符串";byte[] buff1 = Encoding.UTF8.GetBytes(str);buff1= md5.ComputeHash(buff1);string append = "";for(int i = 0; i < buff1.Length; i++){append += buff1[i].ToString("x");//转换16进制}Console.WriteLine(append.ToString());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如 requ…

数据结构--二叉树详解

一&#xff0c;概念 1&#xff0c;结点的度&#xff1a;一个结点含有子树的个数称为该结点的度 2&#xff0c; 树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 3&#xff0c;叶子结点或终端结点&#xff1a;度为0的结点称为叶结点&#x…

go语言Gin框架的学习路线(十一)

目录 GORM的CRUD教程 更新操作 更新所有字段 更新指定字段 使用 Select 和 Omit 更新 无 Hooks 更新 批量更新 删除操作 删除记录 批量删除 软删除 物理删除 示例代码 GORM的CRUD教程 CRUD 是 "Create, Read, Update, Delete"&#xff08;创建、查询、…

新手小白的pytorch学习第八弹------分类问题模型和简单预测

目录 1 启动损失函数和优化器2 训练模型创建训练和测试循环 3 预测和评估模型 这篇是接着新手小白的pytorch学习第七弹------分类问题模型这一篇的&#xff0c;代码也是哟~ 1 启动损失函数和优化器 对于我们的二分类问题&#xff0c;我们经常使用 binary cross entropy 作为损…

机器视觉系列之【硬件知识】-工业相机(四)

目录 几个高频面试题目 工业彩色相机如何调节白平衡解决偏色问题 算法原理 多光谱成像技术和相机选型 多光谱相机技术 选择多光谱成像相机技术时的主要考虑因素 智慧工厂机器视觉感知与控制 1 智慧工厂与机器视觉检测控制技术 2 智慧工厂机器视觉感知与控制 基于机器视…

详解yolov5和yolov8以及目标检测相关面试

一、与yoloV4相比&#xff0c;yoloV5的改进 输入端&#xff1a;在模型训练阶段&#xff0c;使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放基准网络&#xff1a;使用了FOCUS结构和CSP结构Neck网络&#xff1a;在Backbone和最后的Head输出层之间插入FPN_PAN结构Head输出…

[NOIP2009 提高组] 最优贸易(含代码题解)

[NOIP2009 提高组] 最优贸易 题目描述 C C C 国有 n n n 个大城市和 m m m 条道路&#xff0c;每条道路连接这 n n n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m m m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&am…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…

JMeter的使用方法

软件安装&#xff1a; 参考链接&#xff1a;JMeter 下载安装及环境配置&#xff08;包含jdk1.8安装及配置&#xff09;_jmeter5.2.1需要什么版本的jdk-CSDN博客 前置知识储备&#xff1a; JMeter的第一个案例 增加线程数 线程&#xff08;thread&#xff09;是操作系统能够进…

ROS2入门到精通—— 2-8 ROS2实战:机器人安全通过狭窄区域的方案

0 前言 室内机器人需要具备适应性和灵活性&#xff0c;以便在狭窄的空间中进行安全、高效的导航。本文提供一些让机器人在狭窄区域安全通过的思路&#xff0c;希望帮助读者根据实际开发适当调整和扩展 1 Voronoi图 Voronoi图&#xff1a;根据给定的一组“种子点”&#xff0…

【数据挖掘】词云分析

目录 1. 词云分析 2. Python 中的 WordCloud 库 1. 词云分析 词云&#xff08;Word Cloud&#xff09;是数据可视化的一种形式&#xff0c;主要用于展示文本数据中单词的频率和重要性。它具有以下几种主要用途和意义&#xff1a; 1. 文本分析 • 识别关键主题&#xff1a;通…

AI学习记录 - 图像识别的基础入门

代码实现&#xff0c;图像识别入门其实非常简单&#xff0c;这里使用的是js&#xff0c;其实就是把二维数组进行公式化处理&#xff0c;处理方式如上图&#xff0c;不同的公式代表的不同的意义&#xff0c;这些意义网上其实非常多&#xff0c;这里就不细讲了。 const getSpecif…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

VSCode python autopep8 格式化 长度设置

ctrl, 打开设置 > 搜索autopep8 > 找到Autopep8:Args > 添加项--max-line-length150

等保测评练习卷17

等级保护初级测评师试题17 姓名: 成绩: 判断题(101=10分)1. 关于安全区域边界的安全审计,三级系统的要求包括应对审计进程进行保护,防止未经授权的中断。( F ) 是安全计算环境的安全审计 2.…

秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录 引言复习堆堆——前K个高频元素个人实现复习实现二参考实现 新作单词搜索个人实现参考实现 分割回文串个人实现参考实现 环形链表II个人实现参考实现 两个有序链表个人实现 总结 引言 又是充满挑战性的一天&#xff0c;继续完成我们的任务吧&#xff01;继续往下刷&a…

WebRTC QoS方法十三.2(Jitter延时的计算)

一、背景介绍 一些报文在网络传输中&#xff0c;会存在丢包重传和延时的情况。渲染时需要进行适当缓存&#xff0c;等待丢失被重传的报文或者正在路上传输的报文。 jitter延时计算是确认需要缓存的时间 另外&#xff0c;在检测到帧有重传情况时&#xff0c;也可适当在渲染时…

【目标检测实验系列】EMA高效注意力机制,融合多尺度特征,助力YOLOv5检测模型涨点(文内附源码)

1. 文章主要内容 本篇博客主要涉及多尺度高效注意力机制&#xff0c;融合到YOLOv5s模型中&#xff0c;增加模型提取多尺度特征的能力&#xff0c;助力模型涨点。&#xff08;通读本篇博客需要7分钟左右的时间&#xff09;。 2. 简要概括 论文地址&#xff1a;EMA论文地址 如下…

Blender材质-PBR与纹理材质

1.PBR PBR:Physically Based Rendering 基于物理的渲染 BRDF:Bidirection Reflectance Distribution Function 双向散射分散函数 材质着色操作如下图&#xff1a; 2.纹理材质 左上角&#xff1a;编辑器类型中选择&#xff0c;着色器编辑器 新建着色器 -> 新建纹理 -> 新…

音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…