【学习笔记】 C# 基础
学习教程:siki学院
一、字符串的使用
1,CompareTo() 方法,比较字符串的内容
string s="siki";int res=s.CompareTo("saki"); //当两个字符串相等时,返回0,当s在字母表的排序靠前是,返回-1,反之,返回1cosole.write(res);
2,Replace() 用另一个字符或者字符串替换字符串中给定的字符或者字符串
string s = "www.cnblogs.com/thesingel/"; //字符串类型 需要用双引号 括起来string newStr = s.Replace(".", "/");Console.WriteLine(s);Console.WriteLine(newStr);Console.ReadKey();
3.,Split() 在出现给定字符的地方,把字符串拆分称一个字符串数组
string[] strArray = s.Split('.');foreach(var temp in strArray){Console.WriteLine(temp);}Console.ReadKey();
4,SubString() 在字符串中检索给定位置的子字符串
string str = s.Substring(4, 11); //从开始位置的索引 截取几个字符串Console.WriteLine(str);
5,ToLower() 把字符串转换成小写形式
string str = s.Lower();Console.WriteLine(str);Console.ReadKey();
6,ToUpper() 把字符串转换成大写形式
string str = s.ToUpper();Console.WriteLine(str);Console.ReadKey();
7,Trim 删除首尾的空白
8.Concat() 方法,合并字符串
9,CopyTo() 方法,把字符串中指定的字符复制到一个数组中
10,Format() 方法,格式化字符串
11,IndexOf() 方法,取得字符串第一次出现某个给定字符串或者字符的位置
12,IndexOfAny() 方法
13,Insert() 把一个字符串实例插八到另一个字符串实例的制定索引处
14,Join()合并字符串数组,创建一个新字符串
二、StringBuild类
1.定义的三种形式
//1
//StringBuilder s = new StringBuilder("www.cnblogs.com/thesingel");//string 是不可变的 而stringbuild的内容时可变的,输入的字符串为初始长度
//2
//StringBuilder s = new StringBuilder(20);//定义初始是的长度为20 当修改时 内存不够 则会申请内存变为2倍
//3
StringBuilder s = new StringBuilder("www.cnblogs.com/thesingel", 100);//定义了初始字符串 以及初始申请的内存长度为100
2.string和StringBuild的区别
StringBuilder str = new StringBuilder("www.cnblogs.com/thesingel", 100);//定义了初始字符串 以及初始申请的内存长度为100str.Append("/thesingel");Console.WriteLine(str);string s = "www.cnblogs.com";s = s + "/thesingel";Console.WriteLine(s);Console.ReadKey();//当频繁对字符进行添加删减时,使用StringBuild的效率会更高一些
3.StringBuild的更多方法
三、正则表达式
1. 正则表达式是由普通字符以及特殊字符(成为元字符)组成的文字模式
2.静态方法Match
检索匹配
3.定位元字符
^ 定位字符串的开始位置
string s="I am a cat";
string res = Regex.Replace(s,"^","开始:");//搜索字符串符合正则表达式的情况,然后把所有符合的位置进行替换成后面的字符串
$ 定义字符串的结束位置
string res=Regex.Replace(s,"$","结束");
4.基本语法元字符
isMatch
string pattern = @"^\d*$"//正则表达式
^\d 表示以数字开头 加上* 表示有0个或者多个\d的数字字符 加上$表示以数字结尾 @表示\d不是转义字符 而是正则表达式的意思
5.反义字符
[abc] 匹配中括号之内的所有字符
[^x] 匹配除了X以外的任意字符
string str = "I am a cat"
string pattern = @"[^ahou]";// 它代表一个字符 表示除了ahou的任意一个字符string s=Regex.Repalce(str,pattren,"*"); //将str字符串中的字符替换成* ,但是ahou这几个字符不进行替换
6.重复描述字符
{n,m} 重复字符n到m次
7.择一匹配
| 逻辑或运算
@"[;,.]"==@"[;]|[,]|[.]"
[]中的满足其中一个即可
8.正则表达式的分组
分组操作符()
ip地址的正则表达式形式
@"(((2[0-4]\d|25[0-5][01]?\d\d?)\.){3}(2[0-4]\d|25[0-5][01]?\d\d?))$"
四、委托
1.关键字 delegate
2.把委托类型当做参数来使用
3.Action委托
action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法
Action<int> a ;//定义了一个委托类型,这个类型可以指向一个没有返回值,有一个int参数的方法
Action<type,tepe....> actionName 其中里面的类型可以放0~16个
4.Func委托
必须有一个返回值
Func<string,int> a=Test1;// Func的泛型类型 前面的指的是参数类型,后面的int指的是返回值类型
参数类型必须给指向的方法的类型的参数类型按照顺序对应
五、冒泡排序
1.int 简单冒泡排序
namespace 冒泡排序法
{class Program{static void sortAarry(int[] array){bool swap = true;do{swap = false;for (int i = 0; i < array.Length - 1; i++){if (array[i] > array[i + 1]){int temp = array[i];array[i] = array[i + 1];array[i + 1] = temp;swap = true;}}} while (swap);}static void Main(string[] args){int[] sortarray = new int[] { 1, 2, 45, 78, 44, 23, 54 };sortAarry(sortarray);foreach (var temp in sortarray ){Console.Write(temp+" ");}Console.ReadKey();}}
}
2.冒泡排序的拓展
六、多播委托
多播委托调用多个方法时 返回值是最后一个方法的返回值类型 所以一般声明为void 无返回值类型
class Program{static void Test1(){Console.WriteLine("test1");}static void Test2(){Console.WriteLine("test2");}static void Main(string[] args){//多播委托 Action a = Test1;//a = Test2; 此时a 指向的是Test2 而Test1的指向已经被覆盖掉了 所以不属于多播委托// 多播委托 表示既可以指向Test1 又可以指向Test2a += Test2;//表示添加了 一个委托Test2a -= Test1;//表示去掉了a中的Test1委托 只保留了Test2委托a -= Test2;//当一个委托没有调用任何一个方法的时候 会出现异常,// 在执行委托时 要判断委托是否为空 如果委托不为空的时候 即可进行调用 if(a!=null)a();Console.ReadKey();}}
七、匿名方法
class Program{static int Test1(int arg1,int arg2){return arg1 + arg2;}static void Main(string[] args){//Func<int, int, int> puls = Test1;//修改成匿名方法的形式//delegate 是匿名方法的关键字 Func<int, int, int> puls = delegate (int arg1, int arg2){return arg1 + arg2;};//匿名方法本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以是使用匿名方法赋值Console.ReadKey();}}
八、Lambda表达式
class Program{static void Main(string[] args){//lambda表达式 用来代替匿名方法 所以一个lambda表达式 也是定义了一个方法//Func<int, int, int> puls = delegate (int arg1, int arg2)//{// return arg1 + arg2;//};//lambda 表达式不需要在声明delegate关键字 ,并且lambda表达式的参数不需要声明类型Func<int, int, int> puls = (arg1, arg2) =>{return arg1 + arg2;};Console.WriteLine(puls(90,60));Console.ReadKey();}}
九、事件
十、观察者模式(猫捉老鼠)
十一、数据的初始化和LINQ总结
var res = from m in masterList //from后面表示查询的集合,m是为这个查询到的内容定义一个别名,而in后面的则是查询的集合where m.Level > 8 //where后面表示 查询的条件select m; //表示返回m 武林高手类型集合 或者m.Level 只返回其中的等级
1.拓展方法
var res = masterList.Where(Test1);//过滤方法static bool Test1(MartialArtsMaster master){if (master.Level > 8) return true;else return false;}
2.拓展方法
//获得所学功夫的杀伤力为100的大侠var res = from m in masterListfrom k in kongfuListwhere m.Kongfu == k.KongfuName && k.Lethality == 100//select new {master = m, kongfu = k};select m;
3.查询结果进行倒叙排列时
//对查询的结果做排序 orderby(descending)var res = from m in masterListfrom k in kongfuListwhere m.Kongfu == k.KongfuName && k.Lethality == 100//select new {master = m, kongfu = k};//进行倒序排序时 在需要倒序排序的字段后 加上关键字 descending orderby m.Age descending ,m.Level descending //先按照第一个属性排序 如果字段相同 则按照第二个字段排序 select m;
Oderby Thenby
4.联合查询 join on
var res = from m in masterListjoin k in kongfuList on m.Kongfu equals k.KongfuNamewhere m.Level>8select m;
5.into groups 分组查询
6.按字段分组 group
//按照字段进行分组 groupvar res = from m in masterListgroup m by m.Menpaiinto gselect new {count = g.Count(), key = g.Key};// key 代表按照那个属性分的组
7.量词操作符 any all
bool res =masterList.Any(m => m.Menpai == "丐帮");Console.Write(res);
bool res =masterList.All(m => m.Menpai == "丐帮");Console.Write(res);
第十二 反射和特性
1.type类
2.Assembly 程序集
MyCalss my = new MyCalss();Assembly assembly = my.GetType().Assembly;Console.WriteLine(assembly.FullName);Type[] types = assembly.GetTypes();foreach (var type in types){Console.Write(type);}Console.ReadKey();
3.obsolete 特性
[Obsolete("这个方法被弃用了,请使用NewMenther来代替",true)]static void OldMenther(){Console.WriteLine("OldMenther");}static void NewMenther(){Console.WriteLine("这是新的方法!");}static void Main(string[] args){OldMenther();Console.ReadKey();}
4.conditional 特性
#define IsTest //定义一个宏 [Conditional("IsTest")] //当IsTest被定义时 test1()会被编译 反之,则不会编译,但是test1()中的方法 则还是会被储存下来static void test1(){Console.WriteLine("test1");}static void test2(){Console.WriteLine("test2");}static void Main(string[] args){test1();test2();test1();Console.ReadKey();}
5.调用者信息特性
6.DebuggerStepThrough 特性
可以跳过单个debug的测试步骤
7.创建自定义特性
第十三 线程和进程
1.异步委托
beginInvoke 开启新的线程
2.检测委托线程的结束——通过等待句柄和回调函数
3.线程的开启—Thread类
static void DownLoad(){Console.WriteLine("starting download!");Thread.Sleep(2000);Console.WriteLine("finished download!");}static void Main(string[] args){Thread t = new Thread(DownLoad);t.Start();Console.WriteLine("main");Console.ReadKey();}
4.线程的其他概念 前台线程 后台线程 线程的优先级 线程的状态
vs 默认会创建前台线程 当前台线程结束之后 后台线程会被强制结束
xiancheng.IsBackground =true 则会被判断为后台线程
5.线程的开启——线程池
namespace _11_线程池
{//线程池 中的线程都是 后台线程class Program{static void ThreadMethod(object state){Console.WriteLine("开始线程:"+Thread.CurrentThread.ManagedThreadId);Thread.Sleep(2000);Console.WriteLine("结束线程");}static void Main(string[] args){ThreadPool.QueueUserWorkItem(ThreadMethod); //调用时 必须跟一个参数ThreadPool.QueueUserWorkItem(ThreadMethod); //开启一个工作线程ThreadPool.QueueUserWorkItem(ThreadMethod);ThreadPool.QueueUserWorkItem(ThreadMethod);ThreadPool.QueueUserWorkItem(ThreadMethod);ThreadPool.QueueUserWorkItem(ThreadMethod);Console.ReadKey();}}
}
6.线程的开启——任务
7.连续任务
continueWith
8.线程问题——争用条件和死锁
当两个线程执行同一个条件时,由于执行的速度不同,可能会出现 逻辑上我们不想得到的效果 因此我们可以利用锁的情况 来设定先后执行的 顺序 (数据结构复习。。。)
死锁情况: 当两个线程执行中,相互用到了其中的条件, 但是两者各自锁定,造成死锁,从而无法进行条件的执行
第十四 socket编程——tcp协议
1.服务器端
// 1.创建socketSocket tcpSever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//2.绑定ip和端口号IPAddress ipaddress = new IPAddress(new byte[] {192,168 ,42 ,73});EndPoint point = new IPEndPoint(ipaddress, 7788);//ipendpoint是对ip+端口做了一层封装的类tcpSever.Bind(point);//向操作系统申请一个可用的ip和端口号 用来做通信//3.开始监听 (等待客户端连接)tcpSever.Listen(100);//参数是最大连接数Console.WriteLine("开始监听");Socket clientSocket = tcpSever.Accept();//暂停当前线程,直到有一个客户端连接过来,之后进行下面的代码//使用返回的socket和客户端做通信Console.WriteLine("一个客户端连接过来了");string message = "hello 欢迎你";byte[] date = Encoding.UTF8.GetBytes(message);//对字符串做编码,得到一个字符串的字节数组clientSocket.Send(date);Console.WriteLine("客户端发送过来了一条消息");byte[] date2 = new byte[1024]; //创建一个字节数组作为容器 来承接客户端发过来的数据int length = clientSocket.Receive(date2);string message2 = Encoding.UTF8.GetString(date2, 0, length);Console.WriteLine("接收到了一条从客户端发过来的消息"+message2);Console.ReadKey();
2.客户端
//1,创建socketSocket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//2,发起建立连接的请求IPAddress ipaddress = IPAddress.Parse("192.168.42.73");EndPoint point = new IPEndPoint(ipaddress, 7788);tcpClient.Connect(point);//通过ip:端口号 定位一个要连接到的服务器端byte[] date = new byte[1024];int length = tcpClient.Receive(date);//这里传递一个byte数组 实际上这个date数组用来接受数据//length 返回值表示接收了多少字节的数据string message = Encoding.UTF8.GetString(date, 0, length);//只把接受到的数据做一个转化Console.WriteLine(message);//向服务器端 发送一条消息string message2 = Console.ReadLine();//读取用户的输入 并且发送到服务器端tcpClient.Send(Encoding.UTF8.GetBytes(message2));//把字符串转化为byte数组 Console.ReadKey();
第十四 socket编程——UDP协议
1.服务器端
//1.创建socketSocket udpSever = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//2.绑定ip和端口号udpSever.Bind(new IPEndPoint(IPAddress.Parse("192.168.42.73"),7788));//3.接受数据EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] date = new byte[1024];int length = udpSever.ReceiveFrom(date, ref remoteEndPoint);//这个方法会把数据的来源(ip:prot)放到第二个参数上string message = Encoding.UTF8.GetString(date, 0, length);Console.WriteLine("从ip:"+(remoteEndPoint as IPEndPoint).Address.ToString()+":"+(remoteEndPoint as IPEndPoint).Port+"收到了数据:"+message);
2.客户端
//1. 创建socketSocket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//发送数据EndPoint severPoint = new IPEndPoint(IPAddress.Parse("192.168.42.73"), 7788);string message = Console.ReadLine();byte[] date = Encoding.UTF8.GetBytes(message);udpClient.SendTo(date, severPoint);Console.ReadKey();
第十五 socket编程 tcp协议和udp协议的区别
1.socket-tcpclient tcplistenter
第十六 文件操作
1.文件的操作
//1 相对路径:就是寻找当前程序运行的所在路径FileInfo fileInfo = new FileInfo("TextFile1.txt");Console.WriteLine(fileInfo.Exists);Console.ReadKey();
//2 绝对路径: 加上完整的路径名 FileInfo fileInfo = new FileInfo(@"C:\Users\DMT01\Documents\Visual Studio 2017\Projects\CSharp高级教程\17 文件操作\TextFile1.txt");Console.WriteLine(fileInfo.Exists);Console.ReadKey();
2.文件夹的操作
DirectoryInfo
3.使用file读写文件
4.创建FileStream文件流
比较适合读取二进制文件,例如png图片等;
5.使用StreamReader和streamwriter 读写文本
StreamReader streamReader = new StreamReader("TextFile1.txt");while (true){string str = streamReader.ReadLine();if(str==null) break;Console.WriteLine(str);}Console.ReadKey();
第十七 xml文档
1.xml文档
拥有特定结构的标记语言 树形结构
2.xml的语法规则
文档必须有根元素 属性值必须加引号
第十八 json介绍
1.json的操作
2.json的语法规则
键值对 {“LastName”:“Siki”}
3.json的数据结构
4.引入LitJson的两种方式
(1) 官网引入 json.org
(2)vs——拓展与更新——联机——搜素下载
第十九 插件resharper的配置使用
1.resharper快捷键使用 选择第二个 IDEA
.
【学习笔记】 C# 基础相关推荐
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
- Python学习笔记_1_基础_2:数据运算、bytes数据类型、.pyc文件(什么鬼)
Python学习笔记_1_基础_2:数据运算.bytes数据类型..pyc文件(什么鬼) 一.数据运算 Python数据运算感觉和C++,Java没有太大的差异,百度一大堆,这里就不想写了.比较有意思 ...
- python input 拖入路径 去除转义 空格_python学习笔记(基础-2)(转载)
1.输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 2.输入 如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变 ...
- php基础教学笔记,php学习笔记:基础知识
php学习笔记:基础知识 2.每行结尾不允许有多余的空格 3.确保文件的命名和调用大小写一致,是由于类Unix系统上面,对大小写是敏感的 4.方法名只允许由字母组成,下划线是不允许的,首字母要小写,其 ...
- java基本语法心得_Java学习笔记(一)——基础语法(上)
Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...
- C基础学习笔记——01-C基础第02天(用户权限、VI操作、Linux服务器搭建)
在学习C基础总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 01-C基础第02天(用户权限.VI操作.Linux服务器搭建) 打开终端:ctrl+alt+t ...
- Python入门学习笔记1-Python基础
Python入门学习笔记1-Python基础 前言:本文介绍了Python学习的前导知识概念以及必记基础函数,如善用help方法查看帮助文档,以及内置对象类型的概念以及常用函数的详解. 一.Pytho ...
- 学习笔记-零基础学习人工智能(0)
学习笔记-零基础学习人工智能(0) 背景 规划 背景 作为物理专业的大龄青年,由于兴趣爱好想学习下人工智能.主要感兴趣的方向是对抗样本生成.自己也做了一些了解,但是发现千头万绪,不懂的东西太多.为了梳 ...
- BGP协议学习笔记——BGP基础
BGP协议学习笔记--BGP基础(BGP概念.BGP报文.BGP状态机.BGP关系建立.BGP路由通告) 说明:本文学习笔记整理自网络.华为公开产品文档.华为公开PPT及部分的自我理解 一.BGP简介 ...
- 【学习笔记--FMCW基础知识】
学习笔记--FMCW基础知识 前言 mmWave测距原理 mmWave区分多个物体 mmWave的距离分辨率(Range Solution) mmWave的最大测量距离 前言 由于工作原因需要了解TI ...
最新文章
- 在CentOS 6.3/6.5 64bit上为python 2.7.10安装pycurl模块
- Ant Design Vue 表格内编辑(附完整源码及效果图)
- 瑞星杀毒软件所有监控已禁用!
- 路由协议重分发之RIP协议和EIGEP协议
- 人脸识别再遭弃用,美国之后这回轮到欧盟
- 英特尔“包抄”英伟达:oneAPI对标CUDA、为《王者荣耀》云游戏提供GPU
- NYOJ 643 发短信
- Arduino LiquidCrystal库函数中文对照
- Adobe网页无法访问服务器,Adobe Acrobat时提示“无法访问网络位置\startup”
- HTML5应用程序缓存实现离线Web网页或应用
- top 并grep 特定信息打印至txt
- Nginx 内存池源码阅读
- 《Python核心编程》第一章练习解析
- 联合分布(二):联合分布
- 华为交换机常用查询命令
- html5给文字添加拼音,word怎么为文字添加拼音
- 固态硬盘安装系统时显示,windows无法完成格式化解决办法。
- access用姓名字段统计人数_用Access统计新生数据
- Laravel5.4中文分词搜索-使用 Laravel Scout,Elasticsearch,ik 分词(二)
- android改微信号码,安卓版微信更新,已支持修改微信号
热门文章
- matlab 关闭硬件加速,matlab常见问题集
- 分布式锁-常用的4种方案
- AWR 报告 SQL ordered by Elapsed Time
- 计算机管理丢失computer文件,计算机系统启动失败之BCD文件丢失
- java表示新年快乐,表示新年快乐的优美句子
- android模拟M卡,Android模拟SD卡实现方法解析
- 汇客huikeCRM项目实战-熟能生巧
- R数据分析:交叉滞后模型基础与实例解析
- Mac视频剪辑三件套Final Cut Pro X 10.6.3+ Motion 5.6.1+Compressor 4.6.1安装教程
- Python3.6安装turtle模块