------------------------------------------------
重点提示:
1、基本数据类型的区别:char、byte、short、int、long;float、double;
2、CTS是什么?String和string的区别;
3、枚举类型;
4、自增自减;
5、如何交换两个变量;
6、赋值表达式的值:Console.WriteLine(a=b+1);赋值表达式也有值,它的值就是复制之后左边的值;
7、三元运算符:String s=(i==5?"你好":"我好");
8、if;if……else;if……else if……;案例:体重指数计算器;
9、switch……case;
------------------------------------------------
第 1 节 关键字和标识符
C#定义了一些关键字(public/static/void/class/int/string),这些关键字是构成C#基本语法用的。(默认蓝色)
Main、String、Console等这些都不是关键字。(默认线绿色)
标识符是用来给类、方法、变量等命名用的。
命名规则:1)由字母、中文(不推荐)、数字、下划线 组成;
2)不能以数字开头;
3)不能是关键字。
C#语言是大小写敏感的:demo和Demo是两个东西;
驼峰命名法:每个单词第一个字母大写。如果是变量,第一个单词首字母要小写
标识符要有意义;
标识符的命名规范,不是强制规定,而是“潜规则”:
类名、方法名:大写开头;
变量名:小写开头。
中文可以做变量名,不建议用。
特殊符号不能组成标识符。
(*)扩展:有同学提到“C#中也可以用@做标识符,
比如int @a=5;int @int=6;”,其实@只是一个转义符而已,并不是标识符的一部分。
特殊符号不能组成标识符。
------------------------------------------------
第 2 节 变量的声明和赋值、变量的作用域
程序所使用的数据一般都是内存中的。操作内存的时候要使用地址,通过指向内存的指针操作内存,
变量是给这段内存取一个名字。我要告诉别人如何使用这块内存的话需要给这块区域取一个名字,比如price,这就是变量名“price”。
变量 和 数据是两个东西。
声明+赋初值 变量类型 变量名=初始值(匹配类型的)
声明:变量类型 变量名;
赋值:变量名=初始值;
变更使用之前必须赋初值。
变量的作用域:在同一个作用域内一个变量只能声明一次。
------------------------------------------------
第 3 节 数值类型简介和显式隐式转换
数值类型:
整数类型:
类型 占用字节 取值范围
byte(字节) 1 0到255 无符号(内存的最小单位)
short(短整) 2 -2^15到2^15-1
int(整型) 4 -2^31到2^31-1
long(长整) 8 -2^63到2^63-1
小数类型:
float(单精度浮点数) 4 不用记
double(双精度浮点数) 8 不用记
long > int >short >byte
double > float
1、byte是“字节”类型,代表一个8位二进制,也就是一个字节。
2、整数常量默认是int类型,小数常量默认是double类型。
3、选用数据类型的时候在考虑到数据的可能范围之后,选择最小范围的类型,这样节省资源。
注:项目命名不要用中文和特殊字符。
超范围:编译错误,无法生成exe。
类型转换:(编译只看类型,不看实际值)
小范围转换成大范围是 隐式类型转换
大范围转换成小范围必须显式类型转换,可能数据丢失 (类型)
------------------------------------------------
第 4 节 float和double的声明类型转换等问题
小数类型默认是double,当声明float类型时,必须加F(f)
注:显示数据转换时,要注意丢失数据问题。
1、声明
double d1 = 3.14D;//ok,3.14d也可以
double d2 = 3.14;//ok,一般不用写“D”
double d3 = 3;//ok
float f1 = 3.14;//error:不能从 double 转换为 float。小数默认是double
float f2 = 3.14F;//ok,3.14f也可以
2、小数类型转换
double d1 = 3.14;
float f1 = 3.14F;
double d2 = f1;//ok,隐式类型转换
float f2=d1;//error:不能从 double 转换为 float
float f3=(float)d1;//ok,显式类型转换
int i1 = d1;//error
int i2 = (int)d1;//ok,显式类型转换,会丢失小数部分
double d3 = i1;//ok,隐式类型转换
3、加(+)减(-)乘(*)除(/)
整数/整数 结果是整数
有小数参与的运算,结果是小数类型 (加F)
计算5除以8:
Console.WriteLine(5 / 8); // result: 0 因为两边都是int 结果会隐式转换成int (丢失小数部分)
Console.WriteLine(5.0 / 8.0); // result: 0.625 因为两边都是double 结果是double
Console.WriteLine(5.0 / 8); // result: 0.625 因为有一个数是double 结果是double
Console.WriteLine(5F / 8F); // result: 0.625 因为全部是float 结果是float
Console.WriteLine(5D / 8D); // result: 0.625 因为两边都是double 结果是double
Console.WriteLine(5 / 8f); // result: 0.625 因为有一个数是小数类型 结果是小数类型
------------------------------------------------
第 5 节 String的声明主要是转义符的问题
常用数据类型:
string(String)由字符组成的串,用英文的双引号引起来 "" 。
‘‘ :长度为0的char
"" :长度为0的字符串,有字符串 ,空字符串 等于string.Empty
string.Empty :空字符串
null : 不等于空字符串
"0" :
\ (反斜线):转义 后面的字符有特殊含义 \n 换行字符 \\ 一个斜线 \"\" 一对双引号
在字符串前加“@”:告诉编译器,没有转义字符,(@只对\有作用,当有引号时,不要用@)
------------------------------------------------
第 6 节 char、bool以及string和数值类型的转换
char: 代表一个字符(有且只有一个字符) ,英文的单引号 ‘‘,长度只能为1。
可以是转义字符: char c=‘\n‘; ‘\\‘ ‘\"‘ ‘\‘‘
bool: true false 就两种状态 (两个值)
int:
最大值int.MaxValue ;
最小值: int.MinValue, 其他数值类型也可以通过MaxValue、MinValue获取取值范围。
其他数据类型转换为string:convert
a.ToString() //null 抛异常
推荐:Convert.ToString() //null 不抛异常
显式类型转换仅限整数、小数类型之内。Cast (类型有交集)
String转换为int/long:
Convert.ToInt32("123")、 Convert.ToInt64("456")
------------------------------------------------
第 7 节 CTS(大写String和小写string区别是什么?)
1、不仅可以把C#编译成.Net IL,还支持Basic、Python、Ruby等语言,甚至还支持Java。不同语言中的数据类型定义是不一样的,
.Net中定义了通用的数据类型(CTS,Common Type System):String、Int16、Int32、Int64、Boolean、Double。通过转到定义可以看到这些都是类(结构体)。
2、C#语言规范中定义了string、int、long、bool、double等原始类型,编译器会把这些类型翻译成CTS中的类。反编译看IL就能看到了。
string int long bool double:C#系统关键字
String Int32 Int64 Boolean Double:CTS中定义的类
------------------------------------------------
第 8 节 枚举类型
1、有一些数据是开放性范围的,比如int、float、String。有些数据可选值是有限取值范围的,比如星座、月份名、方向,如果用1/2/3/4代表东南西北,那万一设置了8怎么办?
2、枚举是一种定义确定取值范围的特殊类型语法:
enum Dir
{
East,West,North,South;
}
3、使用Dir d = Dir.East;
eunm 和是类的声明是平级的。(特殊的类)
------------------------------------------------
第 9 节 基本运算符(余、自增自减、字符串)
1、运算符就是加(+)减(-)乘(*)除(/)等符号,英文键盘输入×÷很麻烦,所以用* /表示乘除。
2、求余数运算符“%”:5%4为1、5%5为0、22%7为1。
3、自增:++是对一个变量进行自增运算
int x=3;
x++;
自减:--
4、+还可以用来对字符串进行拼接:"abc"+"cde"
5、+还可以与其他类型拼接:"hello"+5
6、"hello"+5+5、"hello"+(5+5)、5+5+"hello"的区别。
7、表达式从左向右扫描进行扫描运算,一旦遇上一个字符串,之后的运算就变成字符串了。
8、提问:3+5+"hello"+5+3 结果是什么。答案请向下拉 8hello53
字符串和任何其他数据相加都是拼接字符串(其他数据转换成字符串)。
"hello"+5+5 //hello55
5+5+"hello" //10hello 运算从左向右
"hello"+(5+5) //hello10 括号改变运算优先级
------------------------------------------------
第 10 节 赋值运算符和实现加法计算器
1、int i=5;
应该读成“声明int类型变量i,并且把5赋值给i”。
= :赋值运算符不是“等于”的意思 ,左边只能有一个变量
+=: i=i+3 i+=3
-=: i=i-3 i-=3
*=: i=i*3 i*=3
/=: i=i/3 i/=3
------------------------------------------------
第 11 节 变量的复制传递和交换两个变量的值
复制传递。(让变量2指向变量1 “当前”所指向内存的值)
1、交换两个变量的值:
1 2 3 4 5 6 |
|
2、另一种不需要中间变量的做法
int
i=3;
int
j=5; // j=5
i=i+j; // i=8
j=i-j; // j=3
i=i-j; // i=5
3、变种不用中间变量交换两个值方法:
int i=100;
int j=4;
i=i-j;
j=i+j;
i=j-i;
------------------------------------------------
第 12 节 关系运算符和运算符优先级
比较运算符:(关系运算符)用来进行值的真假性判断,结果为bool类型。
== 等于(相等)
!= 不等于(不相等)
> 大于
>= 大于或等于
< 小于
<= 小于或等于
运算符优先级:
程序不仅是给编译器看的,更重要是给程序员看的。
“()” 最伟大的括号解决一切烦恼。
程序可读性很重要,不要写出别人看不懂的代码。
------------------------------------------------
第 13 节 赋值表达式也有值
1、下面程序的执行结果是什么?
int a=3;
int b=4;
Console.WriteLine(a==b); //false
Console.WriteLine(a=b); //4
2、赋值运算本身也是一个值,这个值就是赋值之后左边的值。
int i=(a=b)+3;
Console.WriteLine(i); //7
这个b1呢?bool b1 = (a=b); //编译错误:类型不对,不能赋值
这个b3呢?
bool b1 = false;
bool b2 = true;
bool b3=(b1=b2); //true
------------------------------------------------
第 14 节 前自增和后自增的区别
1、
int i=10;
int i1=i++;
Console.WriteLine(i1); //10
Console.WriteLine(i); //11
int j=10;
int j1=++j;
Console.WriteLine(j1); //11
Console.WriteLine(j); //11
2、i++是赋值之后再自增,++i是先自增再赋值。
i--和--i也是一样的,自己试验。
没有赋值时,i++(表达式的值是i)和++i(表达式的值是i+1),没区别(写程序避免++i)
这个问题面试时常考!
------------------------------------------------
第 15 节 逻辑运算符(与或非)
用来对布尔类型的值进行运算的
二元运算符:+ - * / %
一元运算符:!
&&:(并且)二元运算符,两边都是true结果才是true。“我是中国人”“我是男人”只要有一个为假,那么“我是中国人 并且 我是男人”就是假。
||:(或者)二元运算符,只要有一个是true结果就是true。“我是中国人”“我是男人”只要有一个为真,那么“我是中国人 或者 我是男人”这个判断就是真。
!:(非)一元运算符,取反,真的变假,假的变真。
------------------------------------------------
第 16 节 逻辑运算符的短路问题
使用 && 和 || 时,注意知足问题,前面条件不成立时,就不去计算后面条件的值,直接给出判断结果。
可以使用&和|,排除短路问题(很少使用,只要知道就行)。
使用场所:
int i=8;
int j=0;
bool b=(j!=0)&&(i/j==2);
Console.WriteLine(b);
可以简化运算(避免下一个条件出错的情况使用)
if(str!null && str.Length>5)
------------------------------------------------
第 17 节 三元运算符
条件表达式?表达式1:表达式1
如果“条件表达式”为true,则表达式的值为“表达式1”,否则为“表达式2”
------------------------------------------------
第 18 节 if简介
if(比较表达式){
//一行或多行代码
}
当“比较表达式”为true时执行{}内的代码。
------------------------------------------------
第 19 节 if易错点
1、if("必须是条件表达式") ,不能用if(i=10),C#中条件表达式必须是bool类型。
2、哪怕只有一行代码,也不要省略大括号{}(形成良好的编程习惯)(不易读,增加出错概率)
3、注意 if()后面不能有“;”封号,封号表示结束。
{}表示一个作用域,叫作代码块。
if(i==8); 相当于if(i==8){}
------------------------------------------------
第 20 节 else子句
if语句还可以有else:
if(比较表达式){
//表达式为true时执行的代码块
}
else
{
//表达式为false时执行的代码块
}
好习惯:(不要排除一般不可能的情况)
判断字符串长度时,请写:
if(name.Length<=0)
{
MessageBox.Show("请输入姓名");
}else
{
MessageBox.Show(name+",你好!");
}
------------------------------------------------
第 21 节 elseif及练习
if(条件表达式1){
//表达式1为true时执行的代码块
}
else if(条件表达式2)
{
//表达式1为false,表达式2为true时执行的代码块
}
else if(条件表达式3)
{
//表达式1为false && 表达式2为false ,表达式3为true时执行的代码块
}
else //可以不用最后的else,建议加上,更加严谨
{
表达式都为false时执行
}
------------------------------------------------
第 22 节 if案例:省市联动选择
要点:
1.加载省数据到省列表中(列表填充)
2.选择省后把对应的市列表加载到市列表中去
------------------------------------------------
第 23 节 if案例:体重指数计算器
1、数据类型转换
2、() :括号是万能的
3、条件区间不留缝隙
------------------------------------------------
第 24 节 三元运算符和if之间的选择
作业:用户输入出生的月份、日期,计算用户的星座,然后显示这个星座的说明。
动手才是硬道理。
1、三元运算符能实现的,基本if都能实现,但是if能实现的,三元运算符不一定能实现。
2、简单的判断然后根据判断的bool结果进行简单的赋值才用三元运算符。
------------------------------------------------
第 25 节 switchcase
定义:
switch(表达式)
{
case 取值1:
//执行语句A
break;
case 取值2:
//执行语句B
break;
case 取值3:
//执行语句C
break;
........
default:
//都不满足执行的语句
break;
}
1、表达式可以是byte ,short,int ,char,string,枚举类型,(long)。
2、break意味着switch的结束,不能丢。default(可以不写,但强烈建议要写,代码严谨性)相当于if的else,当所有case都不匹配时,执行default。
3、如果case中没有任何的代码,如果不写break,则会贯穿到下一个代码。
多个switch条件合并的问题:当多个case条件的代码一样时,可以合并,最后一个加break;
只有当进行离散值判断的时候,switch可以用来替换if。switch能做的if都能做,反之不一定。