您的当前位置:首页>全部文章>文章详情

【C#】C#超急速举例入门-适用有C/C++语言基础

CrazyPanda发表于:2024-01-30 23:00:43浏览:339次TAG:

前提

编程环境:vs2022

电脑系统:win10

学习目的:

能看懂c#,不纠结各种细节,快速适应开发。

入门篇

程序结构


1.png

变量类型

类似c语言,不掌握细节,int,float,double都有。

输入输出

Console.WriteLine("变量0:{0}", para0);
var a=Console.ReadLine();

1.png

 运算符

几乎相同。

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;  
        }


对象的多态特性,以及多继承举例

 1.png

 在参数类型为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();
        }
    }
}

1.png

 1.png

 关于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();
        }
    }
}

1.png

 1.png

 1.png

也就是说,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关键字

1.png

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
发表于:2024-02-06 浏览:370 TAG:
【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 控件提供用于
发表于:2024-02-04 浏览:360 TAG:
【C#】C# 自动更新(基于FTP)
目录一、前言二、功能的实现1.本地黑名单2.读取配置文件3.读取 FTP 文件列表4.读取本地文件5.匹配更新6.版本的切换三、环境搭建四、常见问题2023.12.30 更新结束效果启动软件后,会自动读取所有的 FTP 服务器文件,然后读取本地需要更新的目录,进行匹配,将 FTP 服务器的文件同步到本地Winform 界面一、前言在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代
发表于:2024-02-03 浏览:342 TAG:
【C#】C# NLua Winform 热更新
一、概述NLua 是一个用于 .NET 平台的 Lua 脚本绑定库。它允许在 C# 代码中嵌入 Lua 脚本,并允许两者之间进行交互。NLua 的主要特点包括:轻量级:NLua 是一个轻量级的库,易于集成到现有的 .NET 项目中。动态类型:Lua 是动态类型的语言,这意味着变量的类型可以在运行时改变。灵活的绑定:NLua 提供了灵活的绑定机制,使得 C# 和 Lua 之间的数据交互变得简单。丰富的 API:NLua 提供了丰富的 API,以便在 Lua 脚本中调用 .NET 的类和方法。调试支
发表于:2024-02-18 浏览:343 TAG:
【C#】C# Winform 文本面板带滚动条
在PC软件开发中经常有这样的需求,需要在一个固定大小的面板中显示一些内容,并且面板能上下拖动,将所有的内容完整的展示,有点类似网页上看新闻,如果要在 winfrom 中要如何实现的呢,下面就演示如何实现的吧效果:1.新建一个winform 项目,在界面中拖入一个Panel 将 panel1 的 AutoScroll 设置为 True2.再次拖入一个 Panel ,将高度拉长,这时就自动出现了滚动条,只是此时里面还没有任何内容,下面就在 panel2 中加入一点内容。
发表于:2024-02-03 浏览:323 TAG:
【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 
发表于:2024-01-30 浏览:267 TAG:
【C#】C# Winfrom 常用功能整合-2
目录Winfrom 启动一个外部exe文件,并传入参数Winform ListBox用法HTTP下载文件(推荐)Winform HTTP下载并显示进度Winform HTTP下载文件Winform 跨线程访问UI组件Winform 改变文字的颜色和大小Winfrom 启动一个外部exe文件,并传入参数在我们常用的一些软件中,经常有些软件,双击之后根本打不开,这是因为启动时做了限制,我们需要传入一些参数才能打开,在工作中,这个需求也可以用在软件的自动更新上,
发表于:2024-02-02 浏览:333 TAG:
【C#】C# Winfrom 常用功能整合-1
目录Winform 最大化遮挡任务栏和全屏显示问题Winfrom 给图片画 矩形,椭圆形,文字Winfrom TabControl选项卡 动态添加,删除,修改Winform ErrorProvider控件Winform 读取Resources图片Winfrom 读取内存条占用大小,硬盘占用大小Winform 全局捕获异常Winform 用线程写入TXT文件,并更新UI和进度Winform 摄像头识别二维码,保存图片Winform 判断窗体是否已打开Winform 动态添加菜单列表,点击切换对应面
发表于:2024-02-02 浏览:397 TAG:
【C#】C# Winform 定时清理日志
一、前言在 Winform 开发中经常有这样的需求,在用户执行一些操作不正确时,需要将错误信息反馈给用户,比如:登录密码不正确,无法连接到服务器等,一般常见的用法有两个:1.弹框使用 MessageBox.Show("密码错误"); 这样的方式,弹框后,用户必须点击确定后才能执行下一步操作,给用户的体验并不是特别好。2.在界面中显示错误信息,定时清除如果是输入框,直接用 ErrorProvider 控件就行了。如果只是做一些简单的提示信息,那么就要定时清除
发表于:2024-01-31 浏览:297 TAG:
【C#】C# Winform 日志系统
目录一、效果1.刷新日志效果2.单独日志的分类3.保存日志的样式二、概述三、日志系统API1.字段Debug.IsScrollingDebug.VersionDebug.LogMaxLenDebug.LogTitleDebug.IsConsoleShowLog2.方法Debug.Log(string)Debug.Log(string, params object[])Debug.Logs(string)Debug.Logs(string, params object[])Debug.LogSav
发表于:2024-02-18 浏览:361 TAG: