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.xdnf.cn/news/1487142.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI发布GPT-4 Mini的深度分析及中国大模型的弯道超车机会

引言 在OpenAI封禁中国IP访问其API后&#xff0c;紧接着推出了GPT-4 Mini&#xff0c;这是一个引发广泛关注和讨论的新举措。此举不仅让人们质疑OpenAI的战略方向&#xff0c;更引发了对中国大模型是否能弯道超车的讨论。本文将详细分析GPT-4 Mini的特点、市场影响及中国大模型…

广东工程职业技术学院财经学院领导一行莅临泰迪智能科技参观交流

7月19日&#xff0c;广东工程职业技术学院财经学院市场调查与统计分析专业主任苏志鹏、专业老师余乐莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技董事长张良均、副总经理施兴、高校业务部经理孙学镂、校企合作经理吴桂锋进行接待。 仪式伊始&#…

leetcode-79. 单词搜索

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

美食地图开发

调用地图接口展示数据库录入的不同类别地址信息&#xff0c;提供导航服务&#xff0c;手机端电脑端自适应。 语音介绍使用微软的tts接口可选不同语音性别生成

Mysql数据库和Sql语句

数据库管理&#xff1a; sql语句&#xff1a;数据库用来增删改查的语句&#xff08;重要&#xff09; 备份&#xff1a;数据库的数据进行备份 主从复制、读写分离、高可用&#xff08;重要&#xff09; Mysql数据库和Sql语句 一、Mysql数据库 1、数据库&#xff1a;组织、…

HTML(五)——HTML区块,布局

HTML区块 HTML可以通过 <div> 和 <span>将元素组合起来&#xff0c;可以来布局&#xff0c;就是盒子&#xff0c;div是块级盒子&#xff0c;里面 可以放任何东西&#xff0c;span里面装的是文本 HTML 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。 实…

Java——————接口(interface) <详解>

1.1 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本电脑上的USB接口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上&#xff0c;可以插&#xff…

BGP选路之Next Hop

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较,以确定出去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较&#xff0c;从而决定是否将该最优BGP路由放进P路由表中…

Mysql的主从复制(重要)和读写分离(理论重要实验不重要)

一、主从复制&#xff1a;架构一般是一主两从。 1.主从复制的模式&#xff1a; mysql默认模式为异步模式&#xff1a;主库在更新完事务之后会立即把结果返回给从服务器&#xff0c;并不关心从库是否接收到以及从库是否处理成功。缺点&#xff1a;网络问题没有同步、防火墙的等…

Codeforces Round 960 (Div. 2)

比赛链接&#xff1a;Dashboard - Codeforces Round 960 (Div. 2) - Codeforces A题 Submission Bait​​​​​​ 题目&#xff1a; 中文题面&#xff1a; 爱丽丝和鲍勃在大小为 n 的数组 a 中进行游戏。 他们轮流进行运算&#xff0c;爱丽丝先开始。不会运算的一方将输掉…

Vue3 SvgIcon组件开发

在前面自定义tree组件继续功能迭代前&#xff0c;我们先开发一个通用的ScgIcon组件&#xff0c;用于后续组件模板中小图标的展示。 引入iconfont 官网&#xff1a;https://www.iconfont.cn/ 选取图标进行下载&#xff0c;只取iconfont.js文件 在prettier中忽略该文件&#x…

Performance Metrics in Evaluating Stable Diffusion Models

1.Performance Metrics in Evaluating Stable Diffusion Models 笔记来源&#xff1a; 1.Performance Metrics in Evaluating Stable Diffusion Models 2.Denoising Diffusion Probabilistic Models 3.A simple explanation of the Inception Score 4.What is the inception s…

【笔记:3D航路规划算法】一、RRT

目录 关键概念3D路径规划算法1. A*算法2. RRT1. 初始化&#xff1a;2. 实例化搜索算法&#xff1a;3. 路径生成&#xff1a;4. 绘制图像&#xff1a; 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、虚拟现实等…

【BUG】已解决:ValueError: All arrays must be of the same length

ValueError: All arrays must be of the same length 目录 ValueError: All arrays must be of the same length 【常见模块错误】 【解决方案】 问题原因 解决方法 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&…

SolidWorks 二次开发--创建属性页面及控件事件(二)

在前文中我们学习了如何创建和显示属性页面&#xff0c;本章节将重点介绍如何向属性页面中添加控件。控件是属性页面的基本组成部分&#xff0c;可以是文本框、按钮、复选框等&#xff0c;用于用户交互和数据展示。接下来我们将看到如何定义、配置和操作这些控件&#xff0c;让…

边缘设备使用记录--阿加犀AIBox 6490(realsense+yolox部署)

边缘设备使用记录--阿加犀AIBox 6490:realsenseyolox部署 前言Realsense SDK ROSYOLOx部署预处理后处理可视化ROS节点 总结 前言 由于6490这个板子是有type-c接口的&#xff0c;所以这里准备用RealsenseYOLOx来先简单做一个实时的目标检测的东西出来&#xff0c;这里也用到上…

数据开发/数仓工程师上手指南(一)数仓概念总览

前言 笔者毕业最开始从事的就是大数据开发和数据仓库建设工作&#xff0c;途中曾担任过人工智能工程师和计算机视觉工程师&#xff0c;没想到最后兜兜转转还是回到了最原本的工作数据开发工程师。但很少有写关于本职工作的技术内容输出。 之前笔者撰文内容大部分都是关于算法…

echarts里面的option的详细讲解

option4 {// 鼠标移动提示框tooltip: {// 触发类型&#xff08;item&#xff1a;用于散点图、饼图。axion&#xff1a;用于柱状图、折线图。none:什么都不触发&#xff09;trigger: axis,// 提示框内排序order: seriesDesc,// 提示框背景颜色backgroundColor: "#FF5800&q…

python easygui库常用方法介绍

msgbox() 弹出对话框 这是最基本的弹出对话框&#xff0c;用于显示简单的消息或提示。例如&#xff1a; import easygui easygui.msgbox("欢迎使用EasyGUI!") buttonbox() 带有多个按钮的对话框 它会显示一个带有多个按钮的对话框&#xff0c;用户点击后返回所选…

“探求新质生产力 推进中国式现代化”学习交流活动在河北廊坊举办

7月21日&#xff0c;一场以“探求新质生产力 推进中国式现代化”为主题的学习交流活动在河北省廊坊市举办&#xff0c;2000余名企业界人士共同探讨企业发展的新路径与新动力。 7月21日&#xff0c;“探求新质生产力 推进中国式现代化”学习交流活动在河北省廊坊市举办。图为活动…