c#快速入门

news2025/4/19 16:54:30

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析2

在这里插入图片描述


目录

  • 👉🏻 c#和c++不同之处
  • 👉🏻程序文件的基础结构
  • 👉🏻 输入输出
  • 👉🏻c#基本变量类型
  • 👉🏻变量
    • 常见变量
  • 👉🏻常见转义字符
  • 👉🏻 类型转换
    • ⭐️值类型转换注意事项
    • 括号强转
    • Parse法
    • Convert法
    • 其它类型转string类型
  • 👉🏻异常捕获
  • 👉🏻字符串拼接
    • 运算符的字符串拼接
    • string.Format的字符串拼接方式
    • 控制台打印拼接(不用+号连接)
  • 👉🏻 数组
  • 👉🏻 string
  • 👉🏻 函数
    • 函数声明和调用
    • 函数传参
  • 👉🏻 c# 拆装箱子概念
  • 👉🏻面向对象继承使用
    • ⭐️引用类型转换以及注意事项
      • is 关键字
      • as 关键字
    • 面向对象三大特征
    • 继承使用

👉🏻 c#和c++不同之处

1.c#无指针操作符
2.c#无需手动释放内存,使用”引用计数“技术自动释放内存
3.c#只允许单继承,无多继承
4.c#没有宏定义
5.c#完全面向对象

👉🏻程序文件的基础结构

在这里插入图片描述
主要有四个部分组成
1.using System:可以理解为c语言中的头文件包含,相当于一个工具包(库),我们一下若使用些相关工具就得先引用它
2.namespace StudyNewLanguage:我们创建的空间,意义和上面的System一样
3.class Program:库中的类,c#中访问静态成员的语法是 类名.静态成员(c++中是类名::静态成员)
4. static void Main(string[] args):主函数,程序运行的入口。

主函数设置形式
在这里插入图片描述
🍎 值类型变量和引用类型变量区别
1.值类型变量保存的是具体的数据,而引用类型变量保存的数据地址
2.有空引用,无空值的说法
3.值类型变量存储在栈区当中,而引用类型变量存储在堆区当中

👉🏻 输入输出

一、输入
1.Console.ReadLine():直到键盘读取到回车后停止读取
2.Console.Read():只读取一个
3. Console.ReadKey():当检测到有键盘输入时马上停止读取,即只读取一个按键

二、输出

  1. Console.WriteLine:单独输出一行,如何自动换行
  2. Console.Write:与WriteLine一样,但不自动换行
    如何输出变量?
    形式一般有
  • Console.WriteLine(变量名)
  • Console.WriteLine(变量名+“ ”)
    其实若要变量和字符串一起输出,就是通过+将二者连接起来即可

🤠 折叠代码:为了让代码块整洁,区域块清晰
语法👇🏻

#region
.
.
#endregion

👉🏻c#基本变量类型

c#中的基本数据类型,都间接或直接的继承Object,实现了c#完全面向对象
一、值类型

  • 枚举
  • 结构体
  • 13种基本数据类型:int,short,char,……

二、引用类型

  • 自定义类
  • 数组
  • 接口
  • string

枚举、结构体,类的定义区域:命名空间内
在这里插入图片描述
三、结构体引用
为什么有些变量前要加public?
字面意思:Public公用的,给其定义为公用的,该变量就可以在别的类中被使用,就比如我们常使用的类如console中的writeline等功能
比如这里我们就可以在Class1中引用结构体中obj2中的变量
在这里插入图片描述

c#中的结构体和c语言略有不同,{}后不用加;而且声明变量时,直接结构体名+变量名即可

类在声明变量时,必须new,即实例化对象
在这里插入图片描述
在这里插入图片描述

四、Class引用
class声明的变量必须new一个才能引用,作法如下

     class Obj3
    {
       public int a;
    }
   class Class1
    {
        static void Main()
        {
            Obj3 cl = new Obj3();//Obj3 cl相当于定义了一个指针
            cl.a = 5;
        }
    }

👉🏻变量

常见变量

一、有符号的整型变量
1.sbyte:-128~127
2.int:-21亿~21亿
3.short: -32768~32767
4.long:-900万兆~ 900万兆
二、无符号的整型变量
1.byte:0~255
2.unit:0~42亿
3.ushort:0~65535
4.ulong:0~18百万兆
三、浮点数
1.float:存储7/8位有效数字,声明时,要在后面加f,因为在c#当中,默认是double类型,所以要加f声明为float
2.double:存储15~17位有效数字
3.decimal:存储27~28位有效数字,声明时,要在后面加m
四、特殊类型
1.bool:true和false
2.char:存储单个字符
2.string:存储字符串,无上限

👉🏻常见转义字符

1.单引号:’
2.双引号:\“
3.换行:\n
4.斜杆:\
5.制表符:\t,就是空一个tab键(4个空格)
6.光标退格:\b,就是光标向前退一格

如何取消转义字符?
在字符串前加@就可以了。
在这里插入图片描述

👉🏻 类型转换

⭐️值类型转换注意事项

1.高精度转低精度自动转换,而低精度转高精度的则需要强转
2.结构体类型不允许与其它类型进行转换
3.枚举类型可以和int 进行相互转换(但需要强制转换)

括号强转

使用情况:高精度转低精度
语法:变量类型 变量名 = (变量类型)变量
注意:精度问题,范围问题

Parse法

作用:主要将字符串转换为对应类型
语法:变量类型.Parse(“字符字符串”)
注意:字符串必须能够转换为对应类型,且范围必须是变量能够存储的
在这里插入图片描述

Convert法

作用:更准确的将各个类型进行转换
语法:Convert.To变量类型(变量/常量)
注意:变量和常量必须正确,必须能被所设置的接收变量所接收
在这里插入图片描述
该法比强转法好在精度好,会四舍五入
每个类型使用Convert法
在这里插入图片描述

其它类型转string类型

作用:拼接打印
语法:变量.ToString()

在这里插入图片描述

👉🏻异常捕获

语法

在这里插入图片描述

语法实践
在这里插入图片描述

👉🏻字符串拼接

运算符的字符串拼接

判断是否为字符串拼接主要取决于字符串的位置
下面有几个例子
在这里插入图片描述

string.Format的字符串拼接方式

语法:
1.string.Format(“待拼接的内容”,内容1,内容2,……)
2.想要被拼接的内容用占位符替代:数字0~n,依次往后
在这里插入图片描述

控制台打印拼接(不用+号连接)

语法:
Console.WriteLine(“{0},{1},……”,内容1,内容2,……)
在这里插入图片描述

👉🏻 数组

一、一维数组
数组命名语法
1.类型[] 数组名 = {};这里数值自己给,无上限
2.类型[] 数组名 = new 类型[大小]{}; {}可有可无,但若是给了,其中的数据个数必须和数值大小一样
获取数组长度
语法:数组名.Length

二、二维数组
数组命名语法
1.类型[,] 数组名 = {};
2.类型[,] 数组名 = new 类型[行,列]{};

👉🏻 string

语法:
1.string 变量名 = ”字符串“
2.string[] 变量名 =”字符串,字符串,字符串,……“ string 数组
在这里插入图片描述

Split看分隔符是什么

👉🏻 函数

函数声明和调用

1.函数声明
语法格式:

Access_Specifier Return_Type FunctionName(Parameter List)
{
   Function_Body
   Return_Statement
}

其中,Access_Specifier 为访问权限修饰符;Return_Type 为返回值类型;FunctionName 为函数名称;Parameter List 为参数列表;Function_Body 为函数主体;Return_Statement 为返回语句,用来返回数据。另外需要注意的是,访问权限修饰符、参数列表和返回语句是可选的,可以省略。

  • 访问权限修饰符:用于指定函数对一个类的可见性;
  • 返回值类型:用于指定函数返回值的数据类型;
  • 函数名称:用于进行函数调用的唯一名称;
  • 参数列表:在调用函数时需要传递给函数的参数,参数列表是可选的,可以为空;
  • 函数主体:其中包含了实现函数功能的若干代码。

2.函数调用
想要调用我们定义好的函数,首先需要将函数所在的类实例化为对象,然后通过对象.函数名() 的形式即可调用指定的函数,这里有几点需要注意:

  • 若函数在定义时参数列表中定义了若干参数,那么在调用时也应该在函数名后面的括号中填入相应数量的参数,并且与参数列表中的参数类型一一对应;
  • 若函数在定义时没有定义参数列表,那么在调用函数时也不需要在函数名后面填入参数;
  • 对于有返回值的函数,在调用函数时可以使用一个变量(可选)来接收函数的返回值,变量的类型要与函数返回值的类型相同。

提示:若调用同一个类中静态函数(使用 static 修饰的函数),则可以省略实例化对象的过程,直接使用函数名()的形式调用。
而若在其它类定义的函数想调用,所定义函数前得先声明为public即公用的。

🥕如何实例化对象以及调用函数

using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            Demo Obj = new Demo();  //实例化当前类的对象
            //调用定义好的 Output 函数,将字符串传递给函数,并使用 msg 接收函数的返回值
            string msg = Obj.Output("https://editor.csdn.net/md/?articleId=130901273");
            Console.WriteLine(msg);
        }
        /*
         * 定义一个函数,该函数可以接收一个字符串参数,
         * 并返回一个字符串
         */
        public string Output(string message){
            string str = "欢迎访问:" + message;
            return str;
        }
    }
}

🥕类中的static函数(无需实例化为对象)

using System;

namespace c.biancheng.net
{
    class Demo
    {
        static void Main(string[] args){
            string msg = Output("https://editor.csdn.net/md/?articleId=130901273");   // 调用类中的静态函数
            Console.WriteLine(msg);
        }
        /*
         * 定义一个函数,该函数可以接收一个字符串参数,
         * 并返回一个字符串
         */
        static string Output(string message){
            string str = "欢迎访问:" + message;
            return str;
        }
    }
}

函数传参

传值无法修改实参,传址可以修改实参
class 的类名是指针(即地址)

namespace StudyNewLanguage
{
     class Student
    {
        public int score;
    }
    class Fun
    {
        public static void Swap(int a,int b)//在同一个类中,static可以直接函数名访问,无需实例化对象
        {
            int tmp = a;
            a = b;
            b = tmp;
        }
        public static void ChangeNum(Student stu)
        {
            stu.score = 80;
        }
        static void Main()
        {
            int x = 20, y = 30;
       
            Swap(x, y);//传值操作无法改变实参
            Console.WriteLine("x={0},y={1}", x, y);

            Student stu = new Student();//class类,创建变量必须实例化对象
            stu.score = 90;
            ChangeNum(stu);//这里传的是指针
            Console.WriteLine(stu.score);
        }
    }
}

引用类型传递:传递的是数据地址。类、数组、接口、string

那么值类型传递如何修改数据呢?🫠
🔥 法一:使用ref关键字
1.定义函数时,使用ref修饰变量,代表引用类型传递
2.调用函数时,使用ref修饰实参
注意!:实参必须初始化
在这里插入图片描述
🔥 法二:使用out关键字
1.定义函数时,使用out修饰变量,代表引用类型传递
2.调用函数时,使用out修饰实参
注意!:实参可以不初始化,但是函数体必须对实参进行赋值操作 ,即改变

👉🏻 c# 拆装箱子概念

c#完全面向对象,所有的类型,间接或直接继承了Object类
装箱
将其它类型转化为Object类型
拆箱
将Object类型转化为其它数据类型

在程序开发中避免拆装箱,防止不必要的损耗

 int a = 24;
 Object obj = (object)a ;//装
 int b = (int)obj;//拆
 Console.WriteLine(b);

👉🏻面向对象继承使用

⭐️引用类型转换以及注意事项

注意事项
1.子类转父类(自动转换)
2.父类转子类(强制转换)

准确来说应该是子类赋值给父类无需强转,父类赋值给子类需要强转
进行赋值的前提二者类型得要相同,所以要么提前将类型转换,要么强制类型转换

在这里插入图片描述

 Son1 s1 = new Son1();//引用类型创建变量先实例化对象
            Farther f1 = s1;//这里直接将子类赋值给父类
            #endregion

            #region 父类转子类-强转
            Farther f2 = new Farther();
            s1 = (Son1)f2;//此时转换不安全,因为s1为空指针,s1不指向Son1,会转换不成功

is 关键字

用于判断一个类型是否是某个类型

as 关键字

用于引用类型转换,转换成功返回值为非空,失败则为空

 Farther f2 = new Farther();
            Son1 s3 = new Son1();
             if(f2 is Son1)
            {
                s3 = f2 as Son1;
                Console.WriteLine("一步到位");
            }
             else
            {
                s3 = f2 as Son1;//转换失败为空,此时f2的类型不为Son1,所以转换肯定失败
                Console.WriteLine(s3 == null);
                f2 = new Son1();//必须实例化对象后,此时f2类型才为Son1,才能使用as
                Console.WriteLine("二步到位");
            }
            s3 = f2 as Son1;

在这里插入图片描述
总结🌏
1.子类赋值给父类什么都不用担心,因为自动赋值
2.父类赋值给子类,有强制类型转换as关键字两种方法,但是前提是父类得提前 new 子类类型()实例化对象才行

  Farther f2 = new Farther();
            Son1 s3 = new Son1();
            f2 = new Son1();
            s3 = (Son1)f2;//强制类型转换也行

面向对象三大特征

  • 封装 :隐藏技术,类的内部实现向外部隐藏,对类的数据成员进行保护
  • 继承:使用已存在的类派生出新的类,派生出的类拥有父类特性,并且拥有自己类的独特特性
  • 多态:同一个操作对应多种不同的实现,即在同一个继承体系下使用,基类(父类)引用调用派生类同名虚构函数,对应着多个不同类的实现体

继承使用

class 子类:父亲
{
}

🌈没有多继承,一个类只能继承一个父亲(单继承)
🌈一个类可以派生出多个类,但只有一个父亲

构造函数
构造函数相关概念可参考:C#中构造函数的定义以及特点和作用(详细解释)

知识点1派生类构造函数需要调用基类构造函数,当基类有无参构造函数时,可以省略调用否则显示调用
知识点2:静态成员不能访问非静态成员;静态成员函数没有this引用

知识点3:this只引用当前调用者对象,存在于类的非静态成员函数中,只读不改

知识点4:base代表基类,用于调用基类构造或成员函数


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长

在这里插入图片描述

在这里插入图片描述


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

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

相关文章

三门问题的实验验证:贝叶斯概率公式实战

引言 数理统计与概率论经常出现在我们的日常生活中,如果能灵活掌握,可以起到很大的帮助。下面通过几个经典问题的探讨,浅入深出,更加深刻的理解贝叶斯全概率公式和贝叶斯公式的作用。 我的最深的体会就是,当某些已发生…

基于Go开发PaaS平台3

Go开发PaaS平台核心功能 代码仓库地址GitHub - yunixiangfeng/gopaas 10-18 中间件前端页面以及核心API开发(中) C:\Users\Administrator\Desktop\gopaas\middlewareapi\handler\middlewareApiHandler.go package handlerimport ("context"…

【技术解决方案】企业如何从SpringBoot应用平滑迁移到云原生K8s平台

文章目录 在K8S上部署Spring Cloud Alibaba在Kubernetes上部署Spring Cloud Kubernetes在Kubernetes上部署Spring Boot应用方案对比分析拥抱Service Mesh关于DevopsServerless最佳实践 好久不见了,小伙伴们,你们最近还好吗?有没有想我&#x…

常量池介绍

什么是“字面量”和“符号引用”和"直接引用" 最近看jvm时遇到了“字面量”和“符号引用”这两个概念,它们被存放在运行时常量池,看了一些博客以后对这两个概念有了初步认识。 字面量可以理解为实际值,int a 8中的8和String a …

linux互斥锁(pthread_mutex)知识点总结

对于多线程程序来说,我们往往需要对这些多线程进行同步。同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资源。而在此时间内,不允许其它的线程访问该资源。我们可以通过互斥锁(mutex)&a…

1、Vue.js---Vue核心

目录 Vue是什么 什么是渐进式: Vue 的特点 与其它 JS 框架的关联 Vue 周边库 搭建Vue开发环境(2种方式) 1、直接用 2、NPM Hello小案例 小结: 模板语法 代码 小结: 数据绑定 代码: 小结&…

11、渗透性测试及验收测试

目录 什么是安全测试 安全测试与常规测试的区别 SQL注入漏洞 SQL注入漏洞会带来以下几种常见的后果: SQL注入漏洞攻击流程 注入点类型 SQL注入的防范措施 XSS跨站脚本漏洞 XSS原理解析 XSS类型 1、反射型XSS 2、存储型XSS 3、存储型XSS 查找XSS漏洞的…

1.4. 运算符与表达式

在 Java 中,运算符是用于执行特定操作的符号,而表达式是由变量、常量和运算符组成的一段代码,用于计算值。本节将介绍 Java 中的常用运算符和表达式的使用。 1.4.1. 算术运算符 Java 支持以下算术运算符: 加法(&…

C语言基础习题讲解

C语言基础习题讲解 运算符判断简单循环 运算符 1. 设计一个程序, 输入三位数a, 分别输出个,十,百位. (0<a<1000) 样例输入: 251 样例输出: 2 5 1 #include <stdio.h> int main() {int input 0;int x 0;int y 0;int z 0;scanf("%d", &input);x …

chatgpt赋能python:Python三次方函数介绍

Python三次方函数介绍 Python是一种流行的编程语言&#xff0c;用于各种应用程序&#xff0c;包括数据分析和机器学习。Python三次方函数是Python语言中的一个内置函数&#xff0c;可用于计算一个数字的三次方。本文将介绍Python三次方函数的相关内容并提供一些示例。 Python…

chatgpt赋能python:Python三个数相加的方法与应用

Python三个数相加的方法与应用 在现代编程语言中&#xff0c;Python是一个非常流行的语言。Python语言的的特点是易学易用、功能强大、语法简洁等。在Python中&#xff0c;运算也是非常方便的&#xff0c;特别是对于数值计算。本文将讨论如何在Python中实现三个数的加法运算&a…

LeetCode高频算法刷题记录11

文章目录 1. 最大正方形【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 在排序数组中查找元素的第一个和最后一个位置【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 搜索二维矩阵 II【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 翻转二叉树【简单】4.1 题目描述4.2…

POWERLINK协议在stm32单片机+w5500移植成功经验分享

连续折腾了多个晚上&#xff0c;又趁周末又花了一天时间&#xff0c;终于把powerlink协议移植成功到单片机上啦。本想放弃&#xff0c;但想了下不管我能不能用上&#xff0c;结个尾吧&#xff0c;分享给有需要的人。放弃并不难&#xff0c;但坚持一定很酷。为了移植测试这个协议…

Arcgis小技巧【13】——和数据统计相关的各种工具

在Arcgis中可以通过属性表中字段的【统计】功能或使用统计相关的工具对属性表进行数据统计。 在Arcgis工具箱中有一组【统计分析】工具集&#xff0c;不仅包含对属性数据执行标准统计分析&#xff08;例如平均值、最小值、最大值和标准差&#xff09;的工具&#xff0c;也包含…

表的增删改查

目录 表的增删改查create(创建)单行数据 全列插入多行数据 指定列插入插入否则更新替换 retrieve(读取)SELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件英语不及格的同学及英语成绩 ( < 60 )&#xff08;<&#xff09;语文成绩在 […

个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios

目录 前言新建axiosUtil.js 文件基本配置统一URL.env文件与环境变量示例参考资料 请求头超时时间 request 拦截器response 拦截器统一Api管理测试 前言 在上文中&#xff0c;我们封装了统一的后端数据返回结果&#xff0c;有了标准化的接口数据&#xff0c;我们就可以针对它&a…

【Linux性能优化】你知道什么是平衡负载么

什么是平衡负载 首先大家思考一下&#xff0c;当你发现自己的服务变慢时&#xff0c;你会首先使用什么命令来排查&#xff1f;我通常做的第一件事&#xff0c;就是执行top或者uptime命令来了解系统的负载情况。比如像下面这样&#xff0c;我在命令行里输入top命令&#xff0c;…

Springboot +spring security,创建SpringSecurity项目

一.简介 搭建第一个Spring Security项目&#xff0c;看看如何利用Spring Security来保护Java Web项目。 二. 创建SpringSecurity项目 我们这边使用idea进行创建。 2.1创建一个基于Maven的Project项目。 2.2设置项目名称和存储位置 2.3添加项目依赖 在pom.xml文件中&#x…

LeetCode 128 最长连续序列

LeetCode 128 最长连续序列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/longest-consecutive-sequence/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给定一个未排…

【双系统ubuntu安装指引】配置一个顺手的深度学习环境

文章目录 前言1. 前置安装 前言 版本&#xff1a;ubuntu20.04 桌面版 normal安装 第一件事&#xff0c;切换源&#xff1a;换成阿里源 https://blog.csdn.net/u010092716/article/details/125832062 第二件事输入法安装&#xff0c;指引在这里 https://blog.csdn.net/q54434431…