C#从零开始学习(图文教程),持续更新中~
理论知识固然重要,但是只读理论往往是枯燥的,只有通过不断的实践和探索,才能更高效的进行学习。
目录
2.Windows窗口应用输出Hello World(WinForms)
1.类的三大成员(初学可以在实例中慢慢摸索,没必要一开始就花太多时间去深究理论)
2.类与命名空间的使用(创建一个.Net Framework控制台应用 )
一、开发环境准备
1.下载Visual Studio
社区版对于个人使用免费,用于学习以及个人项目开发够用了
当然有心人花点心思也可以白嫖专业版
二、从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.注释
注释是程序员开发过程中对开发进度以及代码功能的解释
做项目不写注释容易被刺杀。养成好习惯,代码跑到哪注释写到哪
注释分为单行注释和多行注释(块注释)
正常输出
输出结果
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类型的参数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访问器的声明
更多推荐
所有评论(0)