【C#】C#超急速举例入门-适用有C/C++语言基础
前提
编程环境:vs2022
电脑系统:win10
学习目的:
能看懂c#,不纠结各种细节,快速适应开发。
入门篇
程序结构
变量类型
类似c语言,不掌握细节,int,float,double都有。
输入输出
Console.WriteLine("变量0:{0}", para0); var a=Console.ReadLine();
运算符
几乎相同。
sizeof();
typeof();
取地址,取值:&,*;
三元运算符: ? :
判断类型:is
强制转换:as。
注释
多行与当行还有文档
两种交互模式
.net 平台:c/s,b/s。
中级篇
方法
基本同函数。
参数
引用参数,输出参数,值传递参数。
体现为ref,out以及普通参数。
void getnames( int id,out name,ref nickname)
类
成员:字段、方法
属性:例子:public string name{ get;set;}
扩充:public string name{ get{return name;}set{name=value;}}
name是此类中的字段。
属性用于保护字段。
属性(Property)的访问器(accessor)包含有助于获取(读取或计算)或设置(写入)属性的可执行语句。访问器(accessor)声明可包含一个 get 访问器、一个 set 访问器,或者同时包含二者。
总而言之,我们给属性赋值,最终去向了字段。
派生类
class 派生类 :父类(基类)
抽象
抽象关键字:abstract
未完成的方法或者类等等。
抽象类,抽象属性,抽象方法。
接口
定义类似于类,可以搭配实现多继承。
多态与重载
方法多态
同一个事件发生在不同的对象上会产生不同的结果。
运算符重载
方法重载
public int Add(int a, int b, int c) { return a + b + c; } public int Add(int a, int b) { return a + b; }
对象的多态特性,以及多继承举例
在参数类型为fulei1的情况下,输入进去的是zilei也可,说明了zilei也是fulei1,但是反之不行,也就是zilei类型的参数不能填入fulei1.
internal class Program { static void Main(string[] args) { zilei zl = new zilei(); zl.draw2(zl); } } public abstract class fulei1 { public abstract void draw(); } public class fulei2 { public virtual void draw2() { Console.WriteLine("虚方法"); } } public interface jiekou { void draw2(fulei1 ); } public class jiekou2 { void draw2() { } } public class zilei:fulei1,jiekou { public override void draw() { Console.WriteLine(); } public void draw2(fulei1 zl) { Console.WriteLine(); } }
高级篇
文件读写
static void Main(string[] args) { FileStream fs = new FileStream("text.txt",FileMode.Open,FileAccess.ReadWrite); byte[] buffer = new byte[4096];//4kb读取 int r=fs.Read(buffer,0,buffer.Length); Console.WriteLine(r); string s=Encoding.UTF8.GetString(buffer,0,r); Console.WriteLine("内容1:"+s); fs.Close(); Console.ReadLine(); fs.Dispose(); //写入 FileStream fs2 = new FileStream("text.txt", FileMode.Open, FileAccess.ReadWrite); string str = "my test2!"; byte[] bufferout = Encoding.UTF8.GetBytes(str); fs2.Write(bufferout,0,str.Length); Console.WriteLine("写入"+str); fs2.Close(); Console.ReadLine(); fs2.Dispose(); FileStream fs3 = new FileStream("text.txt", FileMode.Open, FileAccess.ReadWrite); byte[] buffer3 = new byte[4096];//4kb读取 int r1 = fs3.Read(buffer, 0, buffer.Length); Console.WriteLine(r1); string s1 = Encoding.UTF8.GetString(buffer, 0, r1); Console.WriteLine("内容2:"+s1); fs3.Close(); Console.ReadLine(); fs3.Dispose(); }
函数具体参数可以百度。
读取大文件,复制文件
string filesource = @"录音.m4a"; string target = @"复制.m4a"; FileStream fs = new FileStream(filesource,FileMode.Open,FileAccess.Read); FileStream fsout=new FileStream(target,FileMode.Create,FileAccess.Write); fs.CopyTo(fsout); fs.Close(); fsout.Close(); fs.Dispose(); fsout.Dispose();
复制文件2
internal class Program{static void Main(string[] args){string filesource = @"录音.m4a";string target = @"复制.m4a";//using会自动释放资源using (FileStream fs = new FileStream(filesource, FileMode.Open, FileAccess.Read)){//读//写using (FileStream fsout = new FileStream(target, FileMode.OpenOrCreate, FileAccess.ReadWrite)){//缓存字节流数组byte[] buffer = new byte[4*1024*1024];//循环读取4mbwhile (true){//实际读取字节数int r = fs.Read(buffer, 0, buffer.Length);if (r == 0) break;//输出fsout.Write(buffer, 0, r);}}}}} internal class Program { static void Main(string[] args) { string filesource = @"录音.m4a"; string target = @"复制.m4a"; //using会自动释放资源 using (FileStream fs = new FileStream(filesource, FileMode.Open, FileAccess.Read)) { //读 //写 using (FileStream fsout = new FileStream(target, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { //缓存字节流数组 byte[] buffer = new byte[4*1024*1024]; //循环读取4mb while (true) { //实际读取字节数 int r = fs.Read(buffer, 0, buffer.Length); if (r == 0) break; //输出 fsout.Write(buffer, 0, r); } } } } }
文字文本读写:操作文本streamreader与streamwriter
namespace streamwr { internal class Program { static void Main(string[] args) { string path = @"小说.txt"; using (StreamReader sr=new StreamReader(path)) { //读全文 string quanwen=sr.ReadToEnd(); //从头开始 sr.BaseStream.Seek(0, SeekOrigin.Begin); //读一行 string yihang=sr.ReadLine(); //同上 sr.BaseStream.Seek(0, SeekOrigin.Begin); //读一个字符,结果为-1时说明文件结尾。还有其他用法,自行百度。 string zifu=sr.Read().ToString(); Console.WriteLine("全文:\n"+quanwen+"\n一行:\n"+yihang+"\n字符:\n"+zifu); } Console.ReadKey(); } } }
关于read()的多种用法,以及就基本流返回文件头的探讨:
namespace streamwr { internal class Program { static void Main(string[] args) { string path = @"小说.txt"; using (StreamReader sr=new StreamReader(path)) { //读全文 string quanwen=sr.ReadToEnd(); //从头开始 sr.BaseStream.Seek(0, SeekOrigin.Begin); //读一行 string yihang=sr.ReadLine(); //同上,但是根据结果,这里是无效的 sr.BaseStream.Seek(0, SeekOrigin.Begin); //Console.WriteLine("\n回到开头\n"); string yihang2 = sr.ReadLine(); //读一个字符,结果为-1时说明文件结尾。还有其他用法,自行百度。 sr.BaseStream.Seek(0, SeekOrigin.Begin); char[] buff=new char[2]; //这里应该也是从头开始读 char zifu= (char)sr.Read(); //(char)sr.Read(buff,0,2); sr.BaseStream.Seek(0, SeekOrigin.Begin); int a1=sr.Read(); int a2=sr.Read(); Console.WriteLine(a1+"\n"+a2); char zifu2 = (char)a1; char zifu3 = (char)a2; Console.WriteLine("全文:\n"+quanwen+"\n回到开头读\n一行:\n"+yihang+"\n回到开头\n读一行:\n" + yihang2 + "\n字符1:\n"+zifu+ "\n字符2:\n" + zifu2 + "\n字符3:\n" + zifu3); } Console.ReadKey(); } } }
也就是说,read是会读到换行和回车的。并且返回文件头部的方法只在第一次read to end起效了,虽然一般来说不应该读完一行想回头再读就是了。
在文件后添加还是覆盖文件的选项在path后的true上体现。true为添加,false为覆盖。
using (StreamWriter sw = new StreamWriter(path,true)) { sw.WriteLine("我喜欢你"); }
访问权限修饰
可以修饰类的:public和internal。
其他:private,protect,internal。
public:所有对象都可以访问; private:对象本身在对象内部可以访问; protected:只有该类对象及其子类对象可以访问 internal:同一个程序集的对象可以访问; protected internal:访问限于当前程序集或派生自包含类的类型。
序列化与反序列化
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; namespace xuliehua { internal class Program { static void Main(string[] args) { person p = new person(); p.Age = 1; p.Sex = "man"; p.Name = "wuyi"; using (FileStream fsw = new FileStream("text.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) { //开始序列化对象 BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(fsw, p); } Console.WriteLine("序列化成功"); //接受文件,反序列化 using (FileStream fsr = new FileStream("text.txt",FileMode.Open,FileAccess.Read)) { BinaryFormatter binaryFormatter = new BinaryFormatter(); person p2=(person)binaryFormatter.Deserialize(fsr); Console.WriteLine(p2.Name); } Console.WriteLine("反序列化成功"); Console.ReadKey(); } } [Serializable] class person { string _name; int age; string sex; public string Name{ get { return _name; } set { _name = value; } } public int Age { get { return age; }set { age = value; } } public string Sex { get { return sex; } set { sex = value; } } } }
部分类
partial关键字
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 部分类 { internal class Program { static void Main(string[] args) { } } public partial class person{ string myname; } public partial class person { string getname() { return myname; } } }
密封类
拒绝继承
sealed关键字
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 部分类 { internal class Program { static void Main(string[] args) { } } public sealed class person{ string myname; } public class person2 :person { } }
接口的显式实现
namespace 显式实现接口 { internal class Program { static void Main(string[] args) { } public class bird : flyable { public void fly() { Console.WriteLine("我会飞"); } //显式实现就可以避免与方法重名 void flyable.fly(){ Console.WriteLine("接口的飞"); } } public interface flyable { void fly(); } } }
原文链接https://blog.csdn.net/m0_54138660/article/details/132327278
猜你喜欢
- 【C#】Winform NanUI 0.88版本 JS和C#相互调用
- 目录一、需求版本二、实例JS调用C#注册的只读属性JS调用C#注册的字段JS调用C#注册的同步方法JS调用C#注册的异步方法C#注册一个方法,JS调用并传递参数C#注册一个方法,JS调用并接收C#返回值C#注册一个方法,接收JS的数组参数C#注册一个方法,接收JS的一个函数,执行这个JS函数,并将C#的值传递过去三、结束一、需求在软件的界面和软件逻辑分离后,最重要的就是要处理参数的传递,和函数的调用,因此存在JS中和C#相互调用的需求。版本NanUI 版本:0.8.80.191二、实例using
- 【C#】C# Winform DataGridView 控件和 DataTable
- 目录一、概述二、DataTable 的用法1.创建表和列2.添加行3.取值和赋值4.删除行5.遍历 DataTable6.判断 DataTable 列中是否存在某个值7.设置主键8.获取 DataRow 所在的行号9.DataTable 转换为 List10.将 List 转 DataTable三、DataGridView 的用法1.绑定数据2.获取绑定的数据源3.获取 / 设置 选中单元格的数据4.设置单元格的宽高结束一、概述DataGridView 控件提供用于
- 【C#】C# 自动更新(基于FTP)
- 目录一、前言二、功能的实现1.本地黑名单2.读取配置文件3.读取 FTP 文件列表4.读取本地文件5.匹配更新6.版本的切换三、环境搭建四、常见问题2023.12.30 更新结束效果启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地Winform 界面一、前言在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代
- 【C#】C# NLua Winform 热更新
- 一、概述NLua 是一个用于 .NET 平台的 Lua 脚本绑定库。它允许在 C# 代码中嵌入 Lua 脚本,并允许两者之间进行交互。NLua 的主要特点包括:轻量级:NLua 是一个轻量级的库,易于集成到现有的 .NET 项目中。动态类型:Lua 是动态类型的语言,这意味着变量的类型可以在运行时改变。灵活的绑定:NLua 提供了灵活的绑定机制,使得 C# 和 Lua 之间的数据交互变得简单。丰富的 API:NLua 提供了丰富的 API,以便在 Lua 脚本中调用 .NET 的类和方法。调试支
- 【C#】C# Winform 文本面板带滚动条
- 在PC软件开发中经常有这样的需求,需要在一个固定大小的面板中显示一些内容,并且面板能上下拖动,将所有的内容完整的展示,有点类似网页上看新闻,如果要在 winfrom 中要如何实现的呢,下面就演示如何实现的吧效果:1.新建一个winform 项目,在界面中拖入一个Panel 将 panel1 的 AutoScroll 设置为 True2.再次拖入一个 Panel ,将高度拉长,这时就自动出现了滚动条,只是此时里面还没有任何内容,下面就在 panel2 中加入一点内容。
- 【C#】C#md5加密
- using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace mdstr { internal
- 【C#】C# Winfrom 常用功能整合-2
- 目录Winfrom 启动一个外部exe文件,并传入参数Winform ListBox用法HTTP下载文件(推荐)Winform HTTP下载并显示进度Winform HTTP下载文件Winform 跨线程访问UI组件Winform 改变文字的颜色和大小Winfrom 启动一个外部exe文件,并传入参数在我们常用的一些软件中,经常有些软件,双击之后根本打不开,这是因为启动时做了限制,我们需要传入一些参数才能打开,在工作中,这个需求也可以用在软件的自动更新上,
- 【C#】C# Winfrom 常用功能整合-1
- 目录Winform 最大化遮挡任务栏和全屏显示问题Winfrom 给图片画 矩形,椭圆形,文字Winfrom TabControl选项卡 动态添加,删除,修改Winform ErrorProvider控件Winform 读取Resources图片Winfrom 读取内存条占用大小,硬盘占用大小Winform 全局捕获异常Winform 用线程写入TXT文件,并更新UI和进度Winform 摄像头识别二维码,保存图片Winform 判断窗体是否已打开Winform 动态添加菜单列表,点击切换对应面