理论知识固然重要,但是只读理论往往是枯燥的,只有通过不断的实践和探索,才能更高效的进行学习。
目录
一、开发环境准备
1.下载Visual Studio
二、从Hello World开始学习C#
1.控制台程序输出Hello World
2.Windows窗口应用输出Hello World(WinForms)
3.WPF应用程序输出Hello World
三、初步认识类和命名空间
1.类的三大成员(初学可以在实例中慢慢摸索,没必要一开始就花太多时间去深究理论)
2.类与命名空间的使用(创建一个.Net Framework控制台应用 )
3.命名空间中的类冲突
4.类库的引用
官方类库引用(Console应用程序)
NuGet包引用
DDL引用(黑盒,无源码)
项目引用(白盒,有源码)
四、C#语言基本元素
1.关键字(keyword)
2.运算符(Operator)
3.标识符(Identifier)
4.标点符号
5.数据类型
6.注释
7.var定义类型
8.变量(成员变量)
9.修饰符
10.方法(成员函数)
五、 C#基础方法知识
1.方法的由来
用C语言创建一个函数:
用C#创建方法:
编辑
2.方法的复用
3.方法的重载
4.构造器(构造函数)
5.操作符(运算符)
一、开发环境准备
1.下载Visual Studio
下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux (microsoft.com)https://visualstudio.microsoft.com/zh-hans/downloads/
社区版对于个人使用免费,用于学习以及个人项目开发够用了
当然有心人花点心思也可以白嫖专业版
二、从Hello World开始学习C#
1.控制台程序输出Hello World
选择新建一个项目
按需求分类后选择对应开发环境
开始写代码
代码如下:
using System;namespace SayHello { class SayHello { static void Main(String[] args) { Console.WriteLine("Hello World"); Console.ReadKey(); } }}
using System ;
引用System命名空间(简化代码、提高开发效率)
未引入前
System.Console.WriteLine()
引入后
Console.WriteLine();
namespace SayHello {}
定义一个命名空间(SayHello)
Class SayHello {}
定义一个名为SayHello的类
static void Main(String[] args){}
程序的主入口,在C#中通常只存在一个Main方法,并非只能存在一个Main方法
特别注意,在C#中Main方法第一个字母需要大写,Main != main 。
在C#中Main方法必须用static修饰,即为静态方法,没有创建任何对象的情况下就可以执行
Console.WriteLine();Console.ReadKey();
在控制台输出一行文本
按下任意键后继续
单击F5进行调试运行
Ctrl + F5进行不调试运行
2.Windows窗口应用输出Hello World(WinForms)
创建Windows窗口应用
点击后等待
实现代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WinFormsApp1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { textShowHello.Text = "Hello World" ; } }}
实现效果:
实现原理:
textShowHello.Text = "Hello World" ;
在行为事件面板双击鼠标点击事件,通过代码实现点击事件
textShowHello:在属性面板自己设置的文本框控件名
Text:用于设置或获取文本框内的值(在此事件中为设置值Hello World)
3.WPF应用程序输出Hello World
创建WPF应用程序
注意:WPF也被看做WinForms的升级版
记得给控件取名字 (养成良好习惯)
为Button控件添加事件
点击闪电图标进入事件栏 ,双击Click创建点击事件
在方法中写代码实现点击事件
实现代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace WpfApp2{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void buttonSayHello_Click(object sender, RoutedEventArgs e) { textShowHello.Text = "Hello World"; } }}
实现效果:
单击按钮输出Hello World
三、初步认识类和命名空间
类(Class):构成程序的主体,是现实世界事物的模型
命名空间(namespace):以树型结构组织类(和其他类型)
类与对象的关系:对象(实例),就是类的实例化,类是一个概念,而对象就是存在概念中的个体,比如动物是一个概念也就是一个类,而狗就是一个对象,猫也是一个对象,你可以说狗和猫是动物,但是你不能说动物一定就是狗和猫。
1.类的三大成员(初学可以在实例中慢慢摸索,没必要一开始就花太多时间去深究理论)
属性(Property):属性用于封装对象的状态。
方法(Method):方法用于封装对象的行为和功能。
事件(Event):事件用于实现观察者模式,实现对象间的松耦合通信。
2.类与命名空间的使用(创建一个.Net Framework控制台应用 )
在一个项目中,我们会创造很多的类,同时也会使用很多官方已经定义好的类,在VS中类被靓青色标识
引用命名空间可以减少代码量、提高开发效率
例如:
引用System命名空间时:
using System ;namespace HelloWorld { class Hello { static void Main(String[] args) { Console.WriteLine("图书馆里有什么?"); Console.WriteLine("《红楼梦》"); Console.WriteLine("《西游记》"); Console.WriteLine("《水浒传》"); Console.WriteLine("《三国演义》"); } }}
引用System命名空间
using System ;
输出语句
Console.WriteLine("图书馆里有什么?");
实现效果:
未引用System命名空间:
//using System ;namespace HelloWorld { class Hello { static void Main(string[] args) { System.Console.WriteLine("图书馆里有什么?"); System.Console.WriteLine("红楼梦?"); System.Console.WriteLine("西游记?"); System.Console.WriteLine("水浒传?"); System.Console.WriteLine("三国演义?"); } }}
将引用注释
//using System ;
输出语句
System.Console.WriteLine("图书馆里有什么?");
如果没有使用using System
引用System
命名空间,那么在每次使用其中的类型或方法时,都需要使用完整的命名空间路径来指明其地址。
错误使用时:
将鼠标焦点放在红色波浪线上按Alt + Enter 或者点击带红叉的小灯泡
查看错误信息,选择解决方案
3.命名空间中的类冲突
引用命名空间的意义在于简化开发避免类名冲突,不同的命名空间可能包含相同的类名,指定不明就会引起冲突
如果同时引用命名空间System.Windows.Shapes与System.IO
如果不使用的命名空间请不要引用,避免类冲突。
4.类库的引用
类库引用是使用命名空间的物理基础
引用可分为两类:DLL引用(黑盒,无源码)、项目引用(白盒,有源码)
官方类库引用(Console应用程序)
1.打开对象浏览器
2.选择所有组件,搜索需求类库
3.添加至当前项目,单击所需类库,点击添加
NuGet包引用
1.右键依赖项,选择NuGet管理
2.搜索需求包并下载,左上方查看已安装以及更新操作
3.好处
别人整合好的类库,不需要自己去梳理关系,安装完毕后即可立即使用
DDL引用(黑盒,无源码)
1.右键依赖项,选择添加项目引用
2.点击浏览,在计算机中找到需要使用的类库
3.查看类库,点击视图,点击对象浏览器,在左边查看类库中有哪些命名空间以及引用类
4.注意事项
依赖性:DDL引用需要注意类库中的方法是否正确,如果引用的类库中存在错误的方法,则会导致整个项目无法运行
项目引用(白盒,有源码)
1.将自己创建的类库,或找到的开源类库在VS打开并导入项目
2.将类库导入当前项目
3.效果展示
类库代码
using System;namespace Num{ public class NumClass { public static double Add(double a , double b) { return a + b; } public static double Sub(double a , double b) { return a - b; } }}
项目引用
using System;namespace OperatorsApp1{ class Program { static void Main(String[] args) { double Num1 = Num.NumClass.Add(2,4); double Num2 = Num.NumClass.Sub(5,6); Console.WriteLine(Num1); Console.WriteLine(Num2); } }}
运行结果
4.白盒引用的好处
单击代码区左侧灰色区域创建断点(使用调试运行F5)
点击逐语句或按F11进行错误查询
跳转至断点处对应方法所在类库的位置,自行查错改正。
四、C#语言基本元素
1.关键字(keyword)
关键字是具有特殊含义和功能的固定标识符,例如定义类、方法、变量、控制流等
这里举例几种较为常见的关键字
class 用于定义类 | new 用于创建新的对象实例 |
void 表示一个方法不返回任何值 | int、string、double等表示基本数据类型 |
static 修饰符,用于指定对象是静态的即属于类而非对象 | public、private、protected 用于定义类成员的访问权限 |
this 表示当前对象的引用 | base 表示基类的引用 |
if、else、switch、case 条件语句和选择语句 | for、while、do-while 循环语句 |
return 返回值 | try、catch、finally 异常处理 |
interface 用于定义接口 | enum 用于定义枚举类型 |
delegate 用于定义委托类型 | event 用于定义事件 |
using 用于导入命名空间或释放资源 | namespace 用于定义命名空间 |
sealed、abstract 用于限定类的继承特性 | override 用于在派生类中重写基类成员 |
除了列举的这些关键字外,通过MSDN可以查询到所有的关键字,按照需求可以精确的了解对应关键字具体有什么作用。(想要做到精通C#,那就把C#字典给过几遍)
2.运算符(Operator)
运算符在开发中的运用极深,理解每一个运算符的含义和用法是非常有必要的
这里列举MSDN中所展示的运算符
x.y | 成员访问 |
f(x) | 方法和委托调用 |
a[x] | 数组索引器访问 |
x ++ | 后递增 |
X - - | 后递减 |
new T(...) | 对象和委托创建 |
new T(...){...} | 具有初始化设定项的对象创建 |
new {...} | 匿名对象初始值设定项 |
new T[...] | 数组创建 |
typeof(T) | 获取T的 System.Type 对象 |
checked(x) | 在已检查的上下文计算表达式 |
unchecked(x) | 在未检查的上下文计算表达式 |
default(T) | 获取类型T的默认值 |
delegate{} | 匿名函数(匿名方法) |
+ 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 is y | 检查对象是否兼容于某个类型,返回true或false。 |
x as y | 操作符来尝试将对象转换为某个类型 如果转换成功则返回转换后的对象,否则返回null |
x == y | 等于 |
x != y | 不等于 |
逻辑“与” | x & y | 整型按位“与”,布尔型逻辑“与” |
逻辑“异或” | x ^ y | 整型按位“异或”,布尔型逻辑“异或” |
逻辑“或” | x | y | 整型按位“或”,布尔型逻辑“或” |
短路“与” | x && y | x y必须全为True,方法才会运行 |
短路“或” | x || y | x y有一个为True,则方法正常运行 |
null合并 | X ?? y | 如果x为null则计算结果为y,反之计算结果为x |
条件运算 | x ?: y : z | 如果x为true则计算结果为y,反之计算结果为z |
x = y | 赋值,x = y不是x等于y而是把y的值给x |
x op= y | 复合赋值。支持这些运算符:+=、-=、*=、/=、%=等 |
(T x) => y | 匿名函数(lambda表达式) |
3.标识符(Identifier)
标识符是用来表示变量、类、方法、属性等各种程序实体的名称
注意事项:
1.标识符可以包括字母、数字、下划线(_)
2.标识符不能以数字开头
3.在关键字前使用@可以作为标识符
4.标识符的定义最好有含义
5.标识符区分大小写,例如Myname和MyName,这是两个标识符
6.驼峰命名法:大驼峰命名法,所有单词首字母大写。
小驼峰命名法,第一个单词首字母小写,后续单词首字母全部大写
7.标识符不能包含除下划线_以外的如何符号或空格
8.不能与C#类库名称重名
4.标点符号
标点符号不参与运算
分号; | 用于表示语句的结束,每条语句必须用分号结束 |
大括号{} | 用于标识代码块的开始和结束,大括号里面的代码被视为独立的代码块 |
小括号() | 用于包裹方法、属性、条件语句等的参数和表达式 |
方括号[] | 用于定义数组或访问数组中的元素 |
尖括号<> | 用于表示泛型类型的参数或表示类型约束 |
逗号, | 用于分隔多个参数、数组元素以及在声明语句中初始化变量时分隔不同的值 |
冒号: | 用于表示继承、实现接口、标签标识以及在switch语句中定义case |
点号. | 用于访问对象的成员,如方法、属性、字段等 |
引号 双引号 ' ' " " | 用于表示字符字面量和字符串字面量 |
反引号` | 用于表示字符串字面量或定义verbatim字符串 |
5.数据类型
数据类型用于声明变量的类型,指定存储数据的方式以及可执行的操作
sbyte | -128 至 127 | 有符号8位整数 |
byte | 0 至 255 | 无符号8位整数 |
char | U+0000 至 U+ffff | 16位Unicode字符 |
short | -32768 至32767 | 有符号16位整数 |
ushort | 0 至 65535 | 无符号16位整数 |
int | -2147483648 至 2147483647 | 有符号32位整数 |
uint | 0 至 4294967295 | 无符号32位整数 |
long | -9223372036854775808 至 9223372036854775807 | 有符号64位整数 |
ulong | 0 至 18446744073709551615 | 无符号64位整数 |
float | +-1.5e-45 至 +-3.4e38 | 7位 |
double | +-5.0e-324 至 +-1.7e308 | 15 至 16位 |
bool | 只有两个值,True为真,False为假 |
char | 引号中只能有一个字符如‘a’、‘2’、‘g’ |
String | 可包含零个或多个字符的序列,最大长度约为15亿个字符(在.NET Framework中) |
这里只介绍一部分数据类型,详细的资料按需要查询MSDN
6.注释
注释是程序员开发过程中对开发进度以及代码功能的解释
做项目不写注释容易被刺杀。养成好习惯,代码跑到哪注释写到哪
注释分为单行注释和多行注释(块注释)
正常输出
输出结果
123456789
单行注释
使用:在需要注释的代码前输入 // 即可注释一行代码
输出结果
13579
多行注释(块注释)
使用:在需要注释的代码块前输入 /* 在代码块结束后输入 */ 即可注释一块代码(/**/)
输出结果
9
注释的快捷键:
1.点击工具,选择选项
2.点击键盘,搜索注释,找到注释选中行以及取消注释选中行
3.设置快捷键
7.var定义类型
利用var定义的值会被C#自动编译为对应类型
实现代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace ConsoleApp2{ class Program { static void Main(string[] args) { var a = 58; Console.WriteLine(a.GetType().Name); Console.WriteLine(a.GetType().FullName); Console.WriteLine(a.GetType().Namespace); Console.WriteLine(a.GetType().Assembly); Console.ReadLine(); } } }
实现效果:
实现解析:
因为58是整数类型的值,所以GetType().Name方法返回的值为int32
GetType().Name //获取对象的类型的名称GetType().FullName //获取对象的类型的完全限定名称,及命名空间和属性名称GetType().Namespace //获取对象的命名空间的名称GetType().Assembly //获取对象所在的程序集信息
8.变量(成员变量)
变量是用于存储和操作数据的一种命名标识符
声明变量:
变量类型 变量名 ;
变脸类型 变量名 = 变量值 ;
需要注意的是当声明变量没指定值时,系统会给变量一个初始值
整数类型(int、long、short、byte等):初始值为0
浮点数类型(float、double):初始值为0.0
布尔类型(bool):初始值为false
字符类型(char):初始值为'/0'
引用类型(String、类、接口、委托等):初始值为null
9.修饰符
修饰符是用于改变类、成员、方法、属性等的行为和访问级别的关键字
访问修饰符:
public
10.方法(成员函数)
将逻辑代码封装起来,能够反复调用,用来执行特定任务
访问修饰符 数据类型 方法名(参数){ 功能代码 ; return 返回值 ;}
实例一:加法运算(有参数,有返回值)
实例二:日期打印(无参数,有返回值)
实例三:语句输出(无参数,无返回值)
五、 C#基础方法知识
1.方法的由来
方法(method)的起源需要追溯到早期的编程语言,如高级语言C/C++中的函数(function)即为方法的前身。 方法是面向对象范畴的概念,在非面向对象语言中仍然称为函数。举个例子:
(1).用C语言创建一个函数:
1.创建C++空项目
2. 在右侧源文件中创建项目
将默认的后缀cpp(C++后缀)改为c(C语言后缀)代码实现
#include <stdio.h>double Add(double a,double b){return a + b ;}int main(){double q = 14 ;double w = 16 ;double result = Add(q,w);printf("%f+%f=%f",q, w, result);return 0 ;}
#include <stdio.h>
C语言的预处理指令,它告诉编译器在编译之前包含标准输入输出头文件(Standard Input Output header file)。
这个头文件包含了多种标准输入输出函数的声明,例如printf()和scanf()。当你使用这些函数时,你需要在源代码文件中包含这个头文件,以便编译器知道这些函数的声明和定义。
double Add(double a,double b)
{
return a + b ;
}
定义一个名字为Add的函数,它接受double类型的参数a和b,并返回a + b的和
int main()
{
double q = 14 ;
double w = 16 ;
double result = Add(q,w);
printf("%f+%f=%f",q, w, result);
return 0 ;
}
定义一个main函数来展示函数应用,定义两个double类型的变量q和w。
调用Add函数,将q和w作为参数传递,并将结果存储在result中
printf()函数用于格式化输出内容,%f代表浮点数,将q、w、result作为参数替换,得到14.000000 + 16.000000 = 30.000000 。
实现结果:
(2).用C#创建方法:
实现结果:
代码实现:
using System;namespace CMethod { class Program { static void Main(string[] args) { Calculator calculator = new Calculator(); Console.WriteLine(calculator.GetCircleArea(10)); Console.WriteLine(calculator.GetCylinderVolume(10,10)); Console.WriteLine(calculator.GetConeVolume(10,10)); } } class Calculator { public double GetCircleArea(double r) { return 3.14 * r * r; } public double GetCylinderVolume(double r,double h) { return 3.14 * r * r * h; } public double GetConeVolume(double r, double h) { return 3.14 * r * r * h / 3; } }}
1.在测试项中,我们创建了一个Calculator类
2.而在Calculator类中,我们又定义了GetCircleArea、GetCylinderVolume、GetconeVolume三个方法
3.在Program类的main方法中将Calculator类中定义的三个方法分别调用并输出
C#中的函数不能独立于类(或结构体)之外
2.方法的复用
using System;namespace CMethod { class Program { static void Main(string[] args) { Calculator calculator = new Calculator(); Console.WriteLine(calculator.GetCircleArea(10)); Console.WriteLine(calculator.GetCylinderVolume(10,10)); Console.WriteLine(calculator.GetConeVolume(10,10)); } } class Calculator { public double GetCircleArea(double r) { return Math.PI * r * r ; } public double GetCylinderVolume(double r,double h) { return GetCircleArea(r) * h ; } public double GetConeVolume(double r, double h) { return GetCylinderVolume(r,h) / 3 ; } }}
不使用复用的坏处:
1. 在之前的方法定义中PI以3.14代替并不符合大多数的计算要求,如果出现需要修改PI的定义值,那么在定义的三个方法中都需要修改,以此类推会消耗极大的时间与精力
2.在反复的参数修改中极易出现数值的偏差,导致最终计算结果的偏差错误
3.如果出现错误很有可能牵扯整个流程,代码拖沓又复杂,难维护且浪费资源
使用复用的好处:
1.通过已经定义好的方法,减少无用代码的累积,提高开发效率
2.修改的地方从很多处变成改一处,大大减少了代码出错的可能性,且在维护方面也提升了一大截
3.总而言之,使用方法的复用可以提高代码的内聚性,实现良性循环
3.方法的重载
方法重载在C#与Java中的运用相当广泛,便于扩展且便于理解。
方法签名(Method signature),包括方法名称和参数列表(参数类型、顺序)。在C#中,方法签名是区分同名但参数不同的方法的重要因素。
方法运用:
实现代码:
using System;namespace CMethod { class Program { static void Main(string[] args) { //相同的方法名,传入不同的参数,实现不同的效果 Method m = new Method(); Console.WriteLine(m.Add(500,20)); Console.WriteLine(m.Add(1000,300,14)); Console.WriteLine(m.Add("我是Add方法!")); } class Method { //定义一个名称为Add,参数类型为int,int的方法 public int Add(int a, int b) { return a + b ; } //定义一个名称为Add,参数类型为int,int,int的方法 public int Add(int a, int b,int c) { return a + b + c ; } //定义一个名称为Add,参数类型为String的方法 public String Add(String a) { return a; } } }}
常见错误:
参数类型相同
与返回类型无关
与参数顺序无关
4.构造器(构造函数)
构造器分为两种,一种是有参构造一种是无参构造。在调用一个类时,如果你没有去声明构造,那么系统将默认使用无参构造。
默认使用的构造:
创建有参、无参构造各一个
代码如下:
using System;namespace CMethod { class Program { static void Main(string[] args) { //给有参构造赋值 Student student = new Student(2,"ZhangSan"); Console.WriteLine(student.ID); Console.WriteLine(student.Name); Console.WriteLine("-----------------------------------"); Student student1 = new Student(); Console.WriteLine(student1.ID); Console.WriteLine(student1.Name); } } class Student{ public int ID; public string Name; //无参构造 public Student() { this.ID = 1; this.Name = "Test"; } //有参构造 public Student(int ID,String Name) { this.ID = ID; this.Name = Name; } }}
在这个程序的Student类中我们创建了两个构造函数,利用有参构造输出我们想实现的数值,利用无参构造输出默认值
5.操作符(运算符)
在笔记的第四章我们简单引用了MSDN中对于运算符的定义以及运算符的使用,接下来我将再次列出C#中常用的运算符及其描述
操作符(Operator)、操作数(Operand)
类别 | 运算符 | 使用介绍 |
赋值运算符 | = | 简单赋值运算符,用于将右侧的值赋值给左侧的变量 |
基本操作符 | . | 主要用于访问对象的成员,包括数据成员、方法以及命名空间或类型中的成员
|
() | 方法调用操作符允许你传递参数给方法,并执行该方法所定义的代码
| |
[] | 通常用作数组或列表的索引操作符,用于访问、修改或添加数组或列表中的元素
| |
typeof | 用于检测一个变量或表达式的数据类型
| |
default | 大部分时候作为默认值存在
| |
new | 用于创建对象实例
| |
checked | 用于整数运算及溢出检测有关
| |
unchecked | 用于整数运算及溢出检测有关
| |
sizeof | 用于计算变量/数据类型在当前系统中占用内存的字节数
| |
-> | ||
算法运算符 | + | 加法运算符,用于两个数相加 |
- | 减法运算符,用于两个数相减 | |
* | 乘法运算符,用于两个数相乘 | |
/ | 除法运算符,用于两个数相处 | |
% | 取余运算符,用于两个数相处后取其余数 | |
++ | 自增运算符,用于将变量值加1(前缀、后缀) | |
-- | 自减运算符,用于将变量值减1(前缀、后缀) | |
比较运算符 | == | 等于运算符,用于比较两个值是否相同 |
!= | 不等运算符,用于比较两个值是否不相同 | |
> | 大于运算符,用于比较左侧的值是否大于右侧的值 | |
< | 小于运算符,用于比较右侧的值是否小于右侧的值 | |
>= | 大于等于运算符,用于比较右侧的值是否大于或等于左侧的值 | |
<= | 小于等于运算符,用于比较右侧的值是否小于或等于左侧的值 | |
is | 类型转换操作符,用于类型转换和类型兼容性检查
| |
as | 类型转换操作符,用于类型转换和类型兼容性检查
| |
逻辑运算符 | && | 逻辑与运算符,用于判断两个条件是否都为真 |
|| | 逻辑或运算符,用于判断两个条件是否有一个为真 | |
! | 逻辑非运算符,用于对条件取反 | |
位运算符 | & | 位与运算符,用于比较两个数的二进制表示,并返回一个新的数,其每个位进行“与”运算的结果 |
| | 位或运算符,用于比较两个数的二进制表示,并返回一个新的数,其每个位进行“或”运算的结果 | |
^ | 位异或运算符,用于比较两个数的二进制表示,并返回一个新的数,其每个位都是两个操作数对应进行“异或”运算的结果 | |
~ | 位非(取反)运算符,用于对一个数的二进制表示进行“非”运算,即翻转每个数 | |
<< | 左移运算符,用于将一个数的二进制表示向左移动指定的位数 | |
>> | 右移运算符,用于将一个数的二进制表示向右移动指定的位数 | |
其他运算符 | ?: | 条件(三元)运算符,根据条件选择两值个中的一个 |
&x | 取地址操作符,用于变量的内存地址
| |
*x | 取引用操作符
| |
(T)x | 强制类型转换
| |
复合赋值运算符 | += | 加等于运算符,用于将右侧的值加在左侧的变量上,并将结果赋值给左侧的变量 |
-= | 减等于运算符,用于将左侧的变量减去右侧的值,并将结果赋值给左侧的变量 | |
*= | 乘等于运算符,用于将左侧的变量乘以右侧的值,并将结果赋值给左侧的变量 | |
/= | 除等于运算符,用于将左侧的变量除以右边的值,并将结果赋值给左边的变量 | |
%= | 模(余)等于运算符,用于将左侧的变量和右侧的值取余,并将结果赋值给左侧的变量 | |
&= | 位与等于运算符,用于将左侧的变量和右侧的值进行位与运算,并将结果赋值给左侧的变量 | |
|= | 位或等于运算符,用于将左侧的变量和右侧的值进行位或运算,并将结果赋值给左侧的变量 | |
^= | 位异或等于运算符,用于将左侧的变量和右侧的值进行位异或运算,并将结果赋值给左侧的变量 | |
<<= | 左移等于运算符,用于将左侧的变量的二进制表示向左移动右侧指定的位数,并将结果赋值给左侧的变量 | |
>>= | 右移等于运算符,用于将左侧的变量的二进制表示向右移动左侧指定的位数,并将结果赋值给左侧的变量 |
接下来对运算符优先级进行排序
基本 > 一元 > 乘法 > 加减
移位 > 关系和类型检测 > 相等
位"与" > 位"异或" > 位"或"
短路"与" > 短路"或" > null合并 > 条件
赋值(从右向左运算)
优先级越高,在程序中运算就越靠前
操作符的优先级
可以使用圆括号提高括号内表达式的优先级圆括号可以嵌套C#语言中“[ ]”与“{ }”有专门的用途同优先级操作符的运算顺序
除了带赋值功能的操作符,同优先级操作符都是由左向右进行计算带有赋值功能的操作符的运算顺序是由右向左与数学运算不同,计算机语言的同优先级运算没有“结合率”6.表达式
表达式是一个由变量、常量、运算符和函数等组成的语句,用于计算一个值。这个值可以是整数、浮点数、字符串、布尔值等,取决于表达式的具体构成和类型。
(1).C#中表达式的分类
1.任何可以得到值的运算
2.命名空间
3.类型
4.方法组
5.空值
6.匿名函数
7.属性访问
8.事件访问
9.索引器访问
10.对返回值为void的方法的调用(没有任何返回值)
(2). 语句说明
1.声明语句
2.表达式语句
3.块语句(简称"块")
4.选择(判断、分支)语句
5.迭代(循环)语句
6.跳转语句
7.try...catch...finally语句
8.using语句
9.yield语句
10.checked/unchecked语句
11.lock语句(用于多线程)
12.标签语句
13.空语句
7.字段
字段的定义:
字段(field)是类、结构体或枚举的一个成员,用于存储某种类型的数据字段是类的状态的一部分,它表示对象的某个属性或特性字段可以是任何有效的C#数据类型,包括基本数据类型(如int、double、bool等)、用户定义的类型(如类、结构体等)、枚举类型或数组等字段的声明:
字段通常在类的主体内部声明,可以有访问修饰符(如public、private、protected)来指定其可见性尽管字段声明带有分号,但它不是语句字段的名字一定是名词字段的访问:
字段的访问取决于其访问修饰符公共字段可以从类的外部访问,而私有字段只能从类的内部访问受保护的字段可以在派生类中访问内部字段可以在同一个程序集中的任何位置访问字段的初始化:
无显式初始化时,字段获得其类型的默认值字段可以在声明时进行初始化,也可以在类的构造函数中进行初始化只读字段在初始化后将无法再次进行更改8.属性
属性的定义:
属性(Property)是特殊成员,他提供了一种灵活机制来读取、写入或计算私有字段的值属性通常与私有字段一起使用,以实现封装以及数据隐藏属性包含get和set访问器的声明