目录
0. 开发环境
0.1 Visual Studio2017
- 新建项目:选择 Visual C#,会后选择:控制台应用程序,修改名称、项目位置,点击确定;
- 调试运行:ctr键 + F5键;
1. 变量和常量
1.1 数据类型
C#有15个预定义类型:
13个值类型;
2个引用类型(string 和 object)
自定义类型中:
值类型:struct(结构)、enum(枚举)
引用类型:Class(类)
1.1.1 值类型
bool:逻辑值(真或假),取值:true,false;
sbyte:8位有符号整数类型,取值:-128~127;
byte:8位无符号整数类型,取值:0~255;
short:16位有符号整数类型,取值:-32768~32767;
ushort:16位无符号整数类型,取值:0~65535;
int:32位有符号整数类型,取值:-2147483648~2147483647;
uint:32位无符号整数类型,取值:0~4294967295;
long:64位有符号整数类型,取值:-9223372036854775808~9223372036854775807;
ulong:64位无符号整数类型,取值:0~18446744073709551615;
char:16位字符类型,取值:所有的Unicode编码字符;
float:32位单精度浮点类型(有小数点),取值:大约7个有效十进制数位;
double:64位双精度浮点类型(有小数点),取值:大约15~16个有效十进制数位;
decimal:128位高精度十进制数类型,大约28~29个有效十进制数位;
布尔(bool):值只能是:true,或者false;
字符(char):
char类型的字面量用单引号括起来,例如 char achar = 'a';
char还可以用4位十六进制的Unicode值,例如 char achar = '\u0041';(等同于上面的 char achar = 'a')
1.1.2 引用类型
引用类型
object:根类型,C#中所有类型都派生自本类;
string:表示Unicode字符串;
引用类型包括 class(类)、interface(接口)、数组、delegate(委托)、object和 string 。object是所有类型(引用类型)的根类。string类型是一个从object类型直接继承的密封类型(不能再被继承),其实例表示Unicode字符串。
一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。
引用类型分两步创建:首先在堆栈上创建一个引用变量,然后再堆上创建对象本身A,再把这个内存(A)的句柄(也是内存的首地址)赋给引用变量。
例如:
string s1, s2;
s1 = "C#";
s2 = s1;
其中,s1, s2是指向字符串"C#"的引用变量,s1, s2的值 是字符串“C#“存放在内存中的 地址,而不是值 ”C#“,是存储的一个 地址值。
1.Object类型
object类型就是最终的父类型:
可以使用object引用绑定任何子类型的对象;
2.字符串类型
string 类型表示零或更多Unicode字符组成的序列。string 是 .NET Framework 中String 的别名。
1.2 变量
变量:随着程序的运行而改变其表示的值。
申明变量就是在内存中指定一个存储目标数据的区域。
1.2.0 变量的命名:
标识符必须以 字母或者_(下滑线) 开头,后面跟字母、数字和下划线的组合。但C#是大小写敏感的语言,name、Name分别代表不同的标识符。另外,变量名不能与C#中的关键字相同,除非标识符是以@作为前缀的。
例如:
int x; // 合法
float y1 = 0.0, y2 = 1.0, y3; // 合法,变量申明的同时可以设置初始数值
string char; // 不合法,因为 char 是关键字
string @char; // 合法
1.2.1 变量的声明
变量用于存储特定数据类型的值。
语法:
访问修饰符 数据类型 变量名
1.2.2 Example: 变量的声明
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 变量的声明
namespace Lesson_4_1
{
class Program
{
static void Main(string[] args)
{
// 变量定义的格式:数据类型 变量名 = 赋值;
int intNum = 12;
float fltScore = 89.5f;
}
}
}
1.2.3 选择合适的变量的数据类型
案例说明:
a. 定义一本书的售价为20.12元;
b. 一辆小汽车的乘坐人数为 5 人;
c. 输出信息为 “大家来学C#”;
d. 表示灯泡的开和关的状态;
1.2.4 变量名的命名规范:
1.为变量命名时要遵循 C# 语言的命名规范;
2.变量名只能由 字母、数字和下划线组成,而不能包含空格、标点符号、运算符等其他如@等符号;
3.变量名不能与C#中的关键字名称相同;
思考一下4个变量名中,合法的变量名是:
1.&adw
2.Good byte
3._list
4.jx@shi.com
答案:3
1.2.5 变量命名规则
1.2.5.1 匈牙利命名规则
在变量和函数名中加入前缀以增进人人们对程序的理解。例如所有的字符变量均以ch为前缀。如命名性别的变量:char chSex = '男'。
1.2.5.2 Pascal命名规则
将标识符的首字母和后面连接的每个单词的首字母都大写。如命名一个学生的年龄:int StudentAge = 20;
1.2.5.3 驼峰命名规则
是指混合使用大小写字母来改成变量和函数的名字。第一个单词以小写字母开始;第二个单词的首字母或每一个单词的首字母都采用大写字母,如命名一个学生的姓名,
1.2.6 变量命名建议
1.变量名最好以小写字母开头;
2.变量名应具有描述性质;
3.在包含多个单词的变量名中,从第二个单词开始,每个单词都采用首字母大写的形式。
例如:
string strStudentName = "Li";
// str表示,string;之后的每个单词首字母大写 Studeng、Name;
// 含义:string类型的学生名字的变量名
1.2.7 Example: 变量的数据类型及命名规范
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 变量的数据类型及命名规范
namespace Lesson_5_1
{
class Program
{
static void Main(string[] args)
{
// 定义一本书的售价为20.12元
float fltPrice = 20.12f;
// 一辆小汽车的乘坐人数为 5 人
int intMaxCount = 5;
// 输出信息为 “大家来学C#”
string strInfo = "大家来学C#"; // string 是引用类型
// 表示灯泡的开和关的状态
bool blLightState = true; // true:灯泡是开启状态
}
}
}
1.3 数据类型转换
1.3.1 装箱
装箱:将值类型包装成引用类型的处理过程。
例如:将 int 类型的 123 转换成 object 类型。
注意:装箱 可以 隐式转换, 拆箱 必须 显示的强制转换。
int i = 10;
object obj = i; // 装箱,隐式转换了
int j = int(obj); // 拆箱,显示的强制转换
1、首先从托管堆中为新生成的引用对象分配内存。
2、然后将值类型的数据拷贝到刚刚分配的内存中。
3、返回托管堆中新分配对象的地址。
可以看出,进行一次装箱要进行 分配内存 和 拷贝数据 这两项比较影响性能的操作。
1.3.2 拆箱
将引用类型,转换为值类型,需要进行拆箱操作(boxing);
1.3.3 Example: 数据类型的装箱
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 数据类型的装箱
namespace Lesson_6_1
{
class Program
{
static void Main(string[] args)
{
int intNum = 12; // 值类型,它是在栈中存储
// 类型转换:把值类型转换成引用类型
// 装箱操作:把 值类型 转换成 引用类型,可以采取隐式转换
object objName = (object)intNum;
// 类型转换:引用类型转换成值类型
// 拆箱操作:把 引用类型 转化成值类型,必须 显示转换
object objA = 15;
int ingGetObjA = (int)objA;
int intGetObjA1 = Convert.ToInt32( objA ); // 强制类型的转换
object objB = 12.3;
float fltB = (float)objB;
float fltB1 = Convert.ToSingle( objB ); // 把引用类型转化成单精度的浮点数据类
object objC = 145.6;
double dblC = (double)objC;
double dblC1 = Convert.ToDouble( objC ); // 把引用类型转化成双精度的数据类型
}
}
}
1.4 常量
常量用于在整个过程中将数据保持同一个值,通常可以分为 字面常量 和 符号常量。
1.对于一个整数值,默认的类型就是能够保存它的最小整数类型,其类型可以分为 itn、uint、long 或 ulong。如果默认类型不是想要的类型,可以在常量后面加后缀(U 或 L)来明确指定其类型。
在常量后面加 L 或 l(不区分大小写)表示唱整型。例如:
32 // 这是一个 int 类型
32L // 这时一个 long 类型
在常量后面加 U 或 u(不区分大小写)表示无符号整数。例如:
128U // 这是一个 uint 类型
128UL // 这是一个 ulong 类型
整型常量既可以采用十进制也可以采用十六进制,默认为十进制,在数值前面加0x(或0X)则表示十六进制,十六进制基数用0~9、A~F(或a~f),例如:
0x20 // 十六进制数20,相当于十进制数32
2.一般带小数点的数或用科学计数法表示的数都被认为是浮点数,它的数据类型默认为 double 类型,但也可以加后缀符表明三种不同的浮点格式数。
在数字后面加F(f)表示 float 类型。
在数字后面加D(d)表示 double 类型。
在数字后面加M(m)表示是 decimal 类型。
3.字符常量
字符常量,简单地说,就是用单引号括起来的单个字符,如‘A’,它占16位,以无符号整型数的形式存储这个字符所对应的Unicode代码。这对于大多数图形字符是可行的,但是对一些非图形的控制字符(如回车符)则行不通,所以字符常量的表达有若干种形式。
单引号括起的一个字符,如‘A’。
十六进制的换码系列,以“\x”或“\X”开始。
Unicode码表示形式,以“\U”或“\u”开始。
显示转换整数字符代码,如 (char)66.
字符转义系列,如下所示:
\' 单引号
\b 退格符
\" 双引号
\f 走纸换页符
\\ 反斜线字符
\n 换行符
1.4.1 Example: 常量的使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 常量的使用
namespace Lesson_7_1
{
class Program
{
static void Main(string[] args)
{
/*
// example_1
float fltA = 16.8F; // 在数值后面加上一个符号明确它的数据类型
double dblA = 16.8;
int intA = 0x10;
long longA = 10L;
uint uintA = 10u;
Console.WriteLine( intA ); // 向屏幕输出数据,而这个数据就是括号里的数据
*/
/*
// example_2:转义
char charA = '\'';
Console.WriteLine( charA );
string strInfo = "第一行,\n第二行";
Console.WriteLine( strInfo );
string strBookName = "这是一本\"C#编程的书籍\"";
Console.WriteLine( strBookName );
*/
// example_3: const
// const关键字表示的是常量,也就是常量的值是无法改变的
const double dblPi = 3.14;
const int intConstA = 20;
// intConstA = 30;
}
}
}