C#基础
C#基础
1、.net、C#、aps.net三者之间的关系
-
.net(dot net)
.net是一个平台,抽象的平台概念。
实现形式是库:①定义了基本的类型(通用类型系统CTS,common type system)。 ②包含.net公共语言运行库(CLK,common language runtime,负责管理用.net库开发的所有应用程序的运行)。
核心是.net framework。NET Framework包括两个关键组成元素:①Common Language Runtime,公共语言运行时(CLR)-提供内在管理,代码安全性检测等功能。 ②.NET Framework Class Library,.NET框架类库(FLC)-提供大量应用类库,提高开发效率。
-
C#(C sharp)
C#是一个程序设计语言,仅仅是一个语言,是运行在.net CLR上的,用于创建应用程序的高级语言。
-
ASP.NET是一个网站开发的技术,仅仅是.NET框架中的一个应用模型。
ASP.NET 是用于生成基于Web的应用程序的内容丰富的编程框架。
2、C#语法基础
2.1、cs文件结构
结构展示:
上面程序的各个部分:
- 程序第一行using System; -using关键字用于在程序只能怪包含System命名空间,一个程序一般有多个using语句;
- 下面的namespace声明。一个namespace是一系列的类。WebAppliction1__命名空间包含了类__Program;
- 下面的calss声明。类__Program__包含了程序使用的数据和方法声明。类一般包含多个方法,方法的定义了类的行为。在这里,__Program__类只有一个Main方法。
- 下面的Main方法,是所有C#程序的入口点,Main方法说明当执行时类将做什么动作。
- Main方法通过方法体中的语法指定它的行为。
以下几点值得注意:
- 一个cs文件的结构大约由以上几个部分组成,但是根据不同的需求和作用,会有不同的内容;
- C#是大小写敏感的;
- 所有的语句和表达式必须以分号(;)结尾;
- 程序的执行都是从Main方法开始的;
- 与Java不同的是,文件名可以不同于类的名称;
2.2、C#基本语法
- C#是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种对象组成。相同种类的对象通常具有相同的类型。
案例:
以人类为例,从人类中诞生出生的具体对象“C罗”和“梅西”,同属人类,故俩人类型相同。
2.2.1 关键字
关键字,是对编译器有特殊意义的预定义保留标示符,它们不能在程序中用着标示符。
-
using关键字
在任何C#程序中的第一条语句都是:
using System;
using关键字用于子啊程序中包含命名空间。一个程序可以包含多个using语句。
-
class关键字
class关键字用于声明一个类。
-
C#的注释方式
块注释使用'/* */'符号表示。例如:
/* 这个程序演示 C#语言的多行注释 语法*/
单行注释使用'//'符号表示。例如:
// 这是C#语言的单行注释方法
文档注释用'///'符号表示。例如:
/// <summary> /// 这是主程序入口 /// </summary> /// <param name="args">需要传入的参数</param> public static void Main(string[] args) { }
注释的作用:
- 解释:说明代码作用
- 注销:将暂时不需要的代码注销
铭记:
- 不写注释的是流氓
- 名字瞎起的是扯淡
- 相比注销,注释的意义更大
- 要做到别人一看就能看懂
2.2.2 变量
-
变量是一个供程序存储数据的盒子。在C#中,每个变量都有一个特定的类型,不同类型的变量其内存大小也不尽相同。
C#中提供的基本类型大致可以分为以下几类:
类型 | 举例 |
---|---|
整数类型 | byte、short、int、long |
浮点型 | float和double |
十进制类型 | decimal |
布尔类型 | bool |
字符类型 | string、char |
空类型 | null |
3、C#语法进阶
3.1、 表达式
-
表达式由操作数(operand)和运算符(operator)构成。运算符的示例包括+、-、*、/和new。操作书的示例包含文本、字段、局部变量和表达式。
-
当表达式包含多个运算符时,运算符的优先级(precedence)控制各运算符的计算顺序。例如,表达式x + y * z,按 x + (y * z)计算,因为 * 运算符的优先级高于 + 运算符。
-
大多数的运算符都可以重载(overload)。运算符重载允许指定用户定义的运算符来实现运算,这些运算的操作数至少有一个,甚至所有操作数都属于用户定义的类类型或结构类型。
类别 | 表达式 | 说明 |
---|---|---|
基本 | x.m | 成员访问 |
x(...) | 方法和委托调用 | |
x | 数组和索引器访问 | |
new T(...) | 对象和委托创建 | |
new T(...) | 使用初始值设定项创建对象 | |
new | 匿名对象初始值设定项 | |
new T | 数组创建 | |
一元 | +x | 恒等 |
-x | 求相反数 | |
!x | 逻辑求反 | |
~x | 按位求反 | |
++x | 前增量 | |
--x | 前减量 | |
x++ | 后增量 | |
x-- | 后减量 | |
(T)x | 将x显示转换为类型T | |
二元 | x * y | 乘法 |
x / y | 除法 | |
x % y | 求余 | |
x + y | 加法、字符串串联 | |
x - y | 减法 | |
x << y | 位左移 | |
x >> y | 位右移 | |
x < y | 小于 | |
x > y | 大于 | |
x <= y | 小于或等于 | |
x >= y | 大于或等于 | |
x is T | 如果x为T,则返回true,否则返回false | |
x as T | 返回转换类型T的x,如果x不是T则返回null | |
x == y | 等于 | |
x != y | 不等于 | |
x & y | 整型按位AND,布尔逻辑AND | |
x | y | 位或 | |
x && y | 与,仅当x为true时,才对y求值 | |
x || y | 或,仅当x为false时,才对y求值 | |
X ?? y | 如果x为null,则计算结果为y,否计算结果为x | |
三元 | x ? y : z | 如果x为true,则对y求值;如果x为false,则对z求值 |
赋值或匿名函数 | x = y | 赋值 |
x = x + y | 复合赋值 | |
(T x) => y | 匿名函数(lambda表达式) |
3.2、分支语句
▶️ if语句
if(i > 1)
{
;
}
▶️ if-else语句
// 如果
if(i > 1)
{
....;
}
else
{
....;
}
if(i >= 10)
{
....;
}
else if(i > 0 && i < 10)
{
....;
}
else
{
....;
}
▶️ switch语句
switch(1)
{
case 1:
{
....;
break
}
case 2:
{
....;
break;
}
default:
{
....;
break;
}
}
3.3、循环语句
▶️ for循环
for(int i = 0; i < 10; i++)
{
....;
}
▶️ while循环
while(i < 10)
{
.....;
i++;
}
▶️ do-while循环
do
{
.....;
i++;
}
while(i < 10);
3.4、数组
- 数组是一组相同类型的数据;
- 数组中的数据需要通过数字索引来访问;
3.4.1、数组的声明
- 数组的声明需要使用new关键字;
- 在声明数组时,可以使用{}来初始化数组中的元素;
- 如果在数组声明之初没有使用大括号来初始化数组中的元素,则需要指定数组的大小;
- 在声明初始化有元素的数组时,也可以指定数组的大小;
// 声明没有元素的数组
int[] ints = new int[6];
// 声明初始化有元素的数组
int[] ints = new int[]{1, 2, 3, 4};
// 在声明初始化有元素的数组时,也可以指定数组大小
string[] strings = new int[5]{"H", "E", "L", "L", "O"};
3.5、通过索引获取数组中的元素
- 给数组指定长度时,数组准备存放多少元素,长度就设置为多少;
- 用索引获取数组内的元素时,索引从0开始获取;
- 所有以数组中最大的索引数字,比指定数组长度小于1;
// 声明初始化有元素的数组
int[] ints = new int[]{1, 2, 3, 4, 5};
// 获取数组中第一个元素
int i1 = ints[0];
// 给数组内的元素赋值
ints[0] = 2;
2、函数初识
- 函数好比是对象的动作行为;
- 在定义函数要想好函数所承担的作用,作用越单一越好;
2.1、函数的命名规范
- 函数命名使用大驼峰命名,即开头首字母大写;
- 多个单词拼接时,所有单词首字母大写;
Add();
AddCount();
GetUserInfo();
2.2、函数的参数设置&传参行为
- 参数可认为是外部需要函数帮忙处理的数据;
- 外部通过传递参数的形式,将需要处理的数据交给函数处理;
/// <summary>
/// 加法方法
/// </summary>
/// <param name="firstCount"></param>
/// <param name="secondCount"></param>
public void Add(int firstCount, int secondCount)
{
int totle = firstCount + secondCount;
}
2.3、函数返回值的设置
- 函数返回值可以认为是外部调用某种行为后得到的一种反馈;
/// <summary>
/// 加法方法
/// </summary>
/// <param name="firstCount"></param>
/// <param name="secondCount"></param>
public int Add(int firstCount, int secondCount)
{
int totle = firstCount + secondCount;
return totle;
}
2.4、参数修饰符
▶️修饰符的种类
- 无修饰符:如果一个参数没有用参数修饰符标记,则认为它将按值进行传递,这将意味着被调用的方法收到原始数据的一份副本;
- out:输出参数由被调用的方法赋值,因此按引用传递,如果被调用的方法没有给出输入参数赋值,就会出现编译错误。out 最大的用途就是调用者只使用一次方法的调用就能获得多个返回值。(在C#7.0中要实现一次方法的调用就能获得多个返回值,建议使用元组。);
- ref:调用者赋初始值,并且可以由调用的方法可选的重新赋值(数据是按引用传递的)。如果被调用的方法未能给出ref 参数赋值,也不会有编译错误;
- params修饰符:这个参数修饰符允许将一组可变的数量的参数作为单独的逻辑参数进行传递,方法只能有一个params 修饰符,而且必须是方法的最后一个参数。
▶️out和rel的区别
- out 修饰的参数必须在方法内修改,而ref 也可以修改,也可以不修改;
- out 在传入参数的时候,参数是局部变量的话,可以不用赋值,因为out 一定会对其进行赋值;
- 而ref 修饰的参数,在实参必须有初始值才能调用。因为ref 修饰的不一定会给它赋值;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!