理论知识固然重要,但是只读理论往往是枯燥的,只有通过不断的实践和探索,才能更高效的进行学习。

目录

一、开发环境准备

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)icon-default.png?t=N7T8https://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.ShapesSystem.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不等于
逻辑、条件和null运算符
逻辑“与”x & y整型按位“与”,布尔型逻辑“与”
逻辑“异或”x ^ y整型按位“异或”,布尔型逻辑“异或”
逻辑“或”x | y整型按位“或”,布尔型逻辑“或”
短路“与”x && yx y必须全为True,方法才会运行
短路“或”x || yx 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位整数
byte0 至 255无符号8位整数
charU+0000 至 U+ffff16位Unicode字符
short-32768 至32767有符号16位整数
ushort0 至 65535无符号16位整数
int-2147483648 至 2147483647有符号32位整数
uint0 至 4294967295无符号32位整数
long-9223372036854775808 至 9223372036854775807有符号64位整数
ulong0 至 18446744073709551615无符号64位整数
浮点型
float+-1.5e-45 至 +-3.4e387位
double+-5.0e-324 至 +-1.7e30815 至 16位
逻辑值类型
bool只有两个值,True为真,False为假
字符与字符串类型
char引号中只能有一个字符如‘a’、‘2’、‘g’
String可包含零个或多个字符的序列,最大长度约为15亿个字符(在.NET Framework中)

 这里只介绍一部分数据类型,详细的资料按需要查询MSDN

6.注释

注释是程序员开发过程中对开发进度以及代码功能的解释

做项目不写注释容易被刺杀。养成好习惯,代码跑到哪注释写到哪

注释分为单行注释和多行注释(块注释)

正常输出

输出结果

1
2
3
4
5
6
7
8
9

单行注释

使用:在需要注释的代码前输入  //  即可注释一行代码

输出结果

1
3
5
7
9

多行注释(块注释) 

使用:在需要注释的代码块前输入  /*  在代码块结束后输入 */  即可注释一块代码(/**/

输出结果

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类型的参数ab,并返回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类型的变量qw。

调用Add函数,将qw作为参数传递,并将结果存储在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访问器的声明
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐