【读书笔记】C#高级编程 第二章 核心C#
(一)第一个C#程序
创建一个控制台应用程序,然后输入代码,输入完毕后点击F5
Console.WriteLine();这条语句的意思:把括号内的内容输出到界面上;
Console.ReadKey();这条语句的意思:一般就是用来在程序运行到此处时等待键盘输入,以此来达到不关闭界面的效果,方便我们观察输出结果
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace ConsoleApp1
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Console.WriteLine("Hello World");
14 Console.ReadKey();
15 }
16 }
17 }
点击F5后弹出输出界面如下:
简单解释以上代码:
- C#以英文分号(;)结束语句;
- 用花括号({})把语句组成块;
- C#区分大小写 。
(二)变量
在C#声明变量使用语法:首先变量类型,然后空格,再是变量名,最后以分号结束。
例子:
以下语句声明了一个变量名为x,变量类型为int的变量
int x;
例子:
以下语句同时声明了x,y两个变量,类型变量同时为int类型
int x,y;
1、类型的初始化
C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量
例子:
以下语句对声明的变量进行了初始化(赋值)
int x = 10;
int y = 20, z = 30;
例子:
以下语句在没有初始化的情况下,对变量进行调用是错误的(编译器会报错)
int x;
Console.WriteLine(x);
上面的语句修改为以下语句才能正常运行
int x = 10;
Console.WriteLine(x);
2、类型推断
类型推断使用 var 关键字。在使用var关键字进行变量声明时,一定要初始化,因为编译器需要根据赋值进行类型推断。
例子:
以下两行语句是完全等价的
int x = 10; var x = 10;
3、变量的作用域
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域遵循以下规则:
- 只要类在某个作用域内,其字段(也成为成员变量)也在改作用域内;
- 局部变量存在于表示声明该变量的块语句或方法结束的右花括号之前的作用域内;
- 在for、while或类似语句中声明的局部变量存在于该循环体内。
4、常量
常量是其值在使用过程中不会发生变化的变量。常量的关键字是 const 。
例子:
以下代码声明了一个名为a的常量
const int a = 10;
常量具有如下特点:
常量必须在声明时初始化。指定了其值后,就不能改写了。
常量的值必须能在编译时用于计算。
常量总是静态的。
(三)预定义数据类型
1、值类型和引用类型
概念上的区别:值类型直接存储其值,引用类型存储值的引用
内存存储的区别:值类型存储在堆栈中,而引用类型存储在托管堆上
例子:
因为int是值类型,以下语句会在内存的两个地方存储值20
int x = 20;
int y = 20;
假设我们已经定义了一个类(引用类型)People,并且有一个int类型的Age属性
1 People people1 = new People();
2 people1.Age = 20;
3 People people2 = people1;
4 Console.WriteLine("修改people1.Age之前,people2.Age的值:" + people2.Age);
5 people1.Age = 21;
6 Console.WriteLine("修改people1.Age之后,people2.Age的值:" + people2.Age);
7
8 Console.ReadKey();
运行以上代码,结果如下
根据以上结果我们可以看到people1.Age的修改对people2.Age造成了影响,这是因为引用类型存储的是引用,当people1赋值给people2时,people1和people2就指向了相同的引用,只要其中有一个对引用内容进行了修改,那么所有指向该引用的变量都会发生修改。
2、预定义的值类型
1.整形
C#支持8个预定义整数类型
名称 |
CTS类型 |
说明 |
范围 |
类型后缀 |
sbyte |
System.SByte |
8位有符号整数 |
||
short |
System.Int16 |
16位有符号整数 |
||
int |
System.Int32 |
32位有符号整数 |
||
long |
System.Int64 |
64位有符号整数 |
L |
|
byte |
System.Byte |
8位无符号整数 |
||
ushort |
System.Uint16 |
16位有符号整数 |
||
uint |
System.Uint32 |
32位有符号整数 |
U |
|
ulong |
System.Uint64 |
64位有符号整数 |
UL |
2.浮点型
名称 |
CTS类型 |
说明 |
位数 |
范围 |
类型后缀 |
float |
System.Single |
32位单精度浮点数 |
7 |
F |
|
double |
System.Double |
64位双精度浮点数 |
15/16 |
3.decimal类型
decimal类型是高精度的浮点数,小数的位数可由用户自定义,但因decimal不是基本类型,所以在计算时使用会有性能损失.
名称 |
CTS类型 |
说明 |
位数 |
范围 |
类型后缀 |
decimal |
System.Decimal |
高精度浮点数 |
28 |
M |
4.bool类型
bool和整数值不能相互隐式互换。不能用0来表示False,也不能用非零来表示True.
名称 |
CTS类型 |
说明 |
范围 |
bool |
System.Boolean |
高精度浮点数 |
true/false |
5.字符类型
为了保存单个字符的值,C#支持char数据类型
名称 |
CTS类型 |
值 |
Char |
System.Char |
表示一个16位的(Unicode)字符 |
3、预定义的引用类型
C#支持两种预定义的引用类型
名称 |
CTS类型 |
说明 |
object |
System.Object |
根类型,CTS中的其他类型都是从它派生而来的(包括值类型) |
string |
System.String |
Unicode字符串 |
string与引用类型的常见行为有些区别。例如,字符串是不可改变的。
例子:
string str1 = "字符串1";
string str2 = str1;
Console.WriteLine("修改str1之前,str2的值:"+str2);
str1 = "字符串2";
Console.WriteLine("修改str1之后,str2的值:" + str2);
运行代码,结果如下:
我们可以看到,str1的修改没有对str2的修改。造成这样结果的原因是:字符串虽然是字符串,但因为其不可改变性,在我们对str1进行修改时,会在堆中重新分配一个新的string对象。
(四)流控制
它们不是按代码在程序中的排列位置执行顺序执行的
1、条件语句
条件语句可以根据条件是否满足或根据表达式的值控制代码的执行分支。
1.if语句
测试特定条件是否满足
例子:
以下代码表示当条件满足时运行花括号内的代码
if (条件)
{ }
例子:
以下代码同时设置多个条件,当条件满足时运行对应位置花括号内的代码
int i = 0;
if (i<=0)
{
Console.WriteLine("运行【if (i<=0)】位置代码");
}
else if (i<=1)
{
Console.WriteLine("运行【else if (i<=1)】位置代码");
}
else
{
Console.WriteLine("运行【else】位置代码");
}
运行代码,结果如下
注意:
- if括号中条件的表达式必须等于布尔值;
- 程序只运行从上到下最先满足条件位置的代码。
- 添加到if子句中的else if语句不受数量限制,但else的数量只能为0或1
2.switch语句
switch..case语句适合于从一组互斥的分支中选择一个执行分支
例子:
以下代码会在 i 满足case后面值的时候,运行此case以下最近的break以上这段区间内的代码
int i = 0;
switch (i)
{
case 0:
Console.WriteLine("i=0");
break;
case 1:
Console.WriteLine("i=1");
break;
case 2:
Console.WriteLine("i=2");
break;
default:
break;
}
运行代码,结果如下
注意:
- case的值不能相同,且必须是常量表达式;不允许使用变量
- case子句可以为空(没有运行代码和break),就可以直接跳到下一条case上
- case子句的排放顺序无关紧要
- case的值可以是字符串
2、循环
C#提供了4种不同的循环机制(for、while、do...while和foreach),在满足条件之前,可以重复执行代码块。
1.for循环
C#的for循环提供的迭代循环机制是在执行下一次迭代前,测试是否满足某个条件。语法如下:
for (初始化器; 条件; 迭代器)
{ }
初始化器:在执行第一次循环前要计算的表达式
条件:在每次执行新循环前要测试的表达式,当此表达式为false时,迭代停止
迭代器:每次迭代完要计算的表达式
for循环是预测试循环。for循环非常适合于一个语句或语句块重复执行预定次数。典型用法:
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
运行代码,结果如下:
2.while循环
于for循环相同,while也是一个预测试循环。其语法如下:
while (条件)
{ }
while循环适用于:在循环前,不知道要重复的次数
例子:
bool condition = true;
while (condition)
{
Console.WriteLine("循环内容");
condition = false;
}
运行代码,结果如下:
3.do...while循环
do...while循环是while循环的后测试版本。do...while循环适用于:至少要将循环体执行一次的情况:
例子:
bool condition = false;
do
{
Console.WriteLine("循环内容");
} while (condition);
运行代码,结果如下:
4.foreach循环
foreach循环可以迭代集合中的每一项(现在不必考虑集合的概念,知道集合是一种包含了一堆东西的东西就行)。
例子:
我们假定CustomerList是一个集合
foreach (var item in CustomerList)
{
Console.WriteLine(item);
}
3、跳转语句
1.goto语句
名声不好不介绍
2.break语句
break用于退出for、foreach、while或do...while以及switch语句中某个case语句。
3.continue语句
continue与用于退出for、foreach、while或do...while当前迭代,开始执行下一次迭代,不是退出循环(退出循环是break干的事情)
4.return语句
return语句用于退出类的方法,把控制权返回方法的调用者。
(五)枚举
枚举是用户定义的整形类型。枚举使代码易于维护、更清晰、易于输入。声明方式:
例子:
public enum TimeOfDay
{
Morning = 0,
Afternoon = 1,
Evening = 2
}
我们在switch语句中使用上面的枚举:
TimeOfDay timeOfDay = new TimeOfDay();
switch (timeOfDay)
{
case TimeOfDay.Morning:
Console.WriteLine("Morning");
break;
case TimeOfDay.Afternoon:
Console.WriteLine("Afternoon");
break;
case TimeOfDay.Evening:
Console.WriteLine("Evening");
break;
default:
break;
}
可以获取枚举的字符串表示:
TimeOfDay timeOfDay = new TimeOfDay();
Console.WriteLine(timeOfDay.ToString());
运行代码,结果如下:
从字符串中获取枚举值:
TimeOfDay timeOfDay = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon", true);
(六)名称空间
名称空间提供了一种组织相关类和其他类型的方式。与文件或组件不同,名称空间是一种逻辑组合,而不是物理组合。
显然,名称空间有时会相当长,输入起来很繁琐,这个时候可以在文件的顶部列出类的名称空间,来减少输入:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
名称空间的别名,使用using关键字,语法如下:
using Sy = System;
(七)Main方法
C#程序时从方法Main()开始执行的,这个方式是类和结构的静态方法,并且返回类型只能是int和void
(八)有关编译C#文件的更多内容
如果想得到一个可以有.NET运行库加载的非可执行文件(如DLL),就必须把它编译为一个库。
(九)使用注释
单行注释//...,语法如下:
//这是单行注释
多行注释/**/,语法如下:
/*
这是多行注释
第一行
第二行
*/
(十)C#预处理器指令
主要使用#region和#endregion,其余的见其他参考
【读书笔记】C#高级编程 第二章 核心C#的更多相关文章
- 读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript
1 <script>的6个属性 async 立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer 文档显示之后再执行脚本,只对外部脚本有效 lan ...
- C#高级编程9-第2章 核心C#
C#基础 使用C#命名编译器csc.exe,编译C#程序 变量 变量一般初始化后才能使用 类型判断弱类型var,根据初始值判断类型, 变量作用域,可以访问该代码的区域 类中定义的成员变量和属性,作用在 ...
- 读书笔记 - javascript 高级程序设计 - 第一章 简介
第一章 简介 诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262 一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...
- [读书笔记]算法(Sedgewick著)·第二章.初级排序算法
本章开始学习排序算法 1.初级排序算法 先从选择排序和插入排序这两个简单的算法开始学习排序算法.选择排序就是依次找到当前数组中最小的元素,将其和第一个元素交换位置,直到整个数组有序. public s ...
- Python基础教程 读书笔记(2)第二章 列表和元组
2.1序列概览 列表和元组的主要区别在于,列表可以修改,元组则不能.也就是说如果要根据要求来添加元素,那么列表可能会更好用;而出于某些原因,序列不能修改的时候,使用元组则更为合适.使用后者的理由通常是 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
随机推荐
- 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾
「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...
- 跨模态语义关联对齐检索-图像文本匹配(Image-Text Matching)
论文介绍:Negative-Aware Attention Framework for Image-Text Matching (基于负感知注意力的图文匹配,CVPR2022) 代码主页:https: ...
- Static、Final关键字详解
1.Static 详情见下面代码讲解 点击查看代码 package com.Tang.oop.demo07; public class Student { private static int age ...
- 我的sql没问题为什么还是这么慢|MySQL加锁规则
前言 前阵子参与了字节跳动后端青训营,其中大项目编写涉及到数据持久化一般选择使用MySQL.由于时间原因,数据库使用我选择了无脑三板斧:1. 建立了索引加速查询.2. 关闭自动提交事务.3. 在需要确 ...
- 01-vscode自定义配色方案 插件基础上
01-下载相关主题插件 02- 点击设置按钮 复制id 03-进入插件文件 C:\Users\Administrator\.vscode\extensions 04-复制刚才的id 05-themes ...
- 【填坑】树莓派4B上运行Bullseye版本系统,不能登录xrdp的问题~~
以前使用 buster,安装xrdp后 pi用户xrdp登录正常, 可自从使用了 bullseye系统,pi登录xrdp后,出现黑屏不能登录现象. 网上搜寻解决方案,一种方法是: 登录树莓派后,打开这 ...
- 【机器学习基础】——另一个视角解释SVM
SVM的另一种解释 前面已经较为详细地对SVM进行了推导,前面有提到SVM可以利用梯度下降来进行求解,但并未进行详细的解释,本节主要从另一个视角对SVM进行解释,首先先回顾之前有关SVM的有关内容,然 ...
- 意向不到的Dubug妙招
1.直接dubug到想要到达的位置,直接点击旁边的数字即可. 2.debug后不想重新启动,想重新进入再执行一次debug,可以使用drop frame来删除当前栈,跳到之前的栈再一次进入这个栈. 注 ...
- 浅谈 Lucas 定理
Lucas 定理是用来求 \(C^n_m\bmod p\) 的. 定理 \[C^n_m\equiv C^{n\bmod p}_{m\bmod p}\cdot C^{\lfloor n/p\rfloor ...
- Linux系列之管理用户环境变量
前言 环境变量控制你在Linux工作环境中的外观.行为和感觉.一共有两种类型的变量: 环境变量:这些是内置于系统中的进程范围的变量,控制着系统的外观和行为.因为是进程范围的,所以它们被任何子shell ...