1. C# 是一种计算机语言
(1)微软开发
(2)微软为.NET技术平台的开发语言,是由C、C++、Java发展而来的计算机高级语言。
(3)什么是.NET?是微软用来实现XML、Web Services、SOA和敏捷性的技术。
可以这么说,通过微软开发出来的产品都使用的是.NET技术。
(4)什么是.NET Framework?
其实.NET是一个比较抽象的概念,.NET Framework就是把.NET落到了实处。
它是实现.NET这个技术所需要的资源库。C#语言,微软已经提供了大量的资源库(现成的模块)
,平时开发的时候,我们只需要调用就行了。我们做开发都是站在巨人的肩膀上。
它是.NET所需平台,包括虚拟机、即时编译器、类库、各种建立在.NET上的技术,比如ASP.NET
WCF WF WPF,也包括语言规范、编程语言等等。(说的简单一下就是它是实现.NET这个技术所需要的资源库)
(5)什么是Visual Studio?
它是基于.NET Framework的开发的工具(产品)
2. C#之父
(1)Anders Hejlsberg
C#专门为Microsoft.NET程序框架而创造的语言
(2)为什么要学习C#
C#拥有丰富的类库,对于初学者来说相对来说比较简单的
C#是完全面向对象的、类型安全的语言
程序开发的逻辑和面向对象的概念都是一样,C#学好,Java完全不是问题
对微软产品比较熟悉
3. 学习C#后期可选择的方向
(1)桌面应用程序--Windows Form 窗体
(2)Internet应用程序--Asp.net
比如:MSDN、CSDN、携程、京东、当当网...
(3)手机应用程序--windows Phone
现在window phone用的比较少 Android iOS比较多
(4)Unity3D游戏开发或者虚拟现实
Unity3D后台用的语言是C#
(5)微软产品二次开发:活动目录、SharePoint、Dynamics CRM、Dynamic AX
4. .NET开发环境的搭建
(1)操作系统 windows7企业版以上
(2)数据库平台:SQL Server 2008 R2/2012/2014/2016
(3)软件平台:Visul Studio 2010以上
5. 控制台应用程序
类似DOS
演示:输入两个小于1000的 正整数,求两个数的和
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyCalculator01
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("我的计算器"); //Console.WriteLine()输出后带回车的
Console.WriteLine("========================");
Console.Write("请输入第一个数字:"); //Console.Write()不带回车
int num01 = Convert.ToInt32(Console.ReadLine()); //定义个变量num01保存输入的值 因为屏幕输入的是字符串,所以要转换成int
Console.Write("请输入第二个数字:"); //Console.Write()不带回车
int num02 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("计算结果:{0}+{1}={2}",num01,num02,num01+num02); //{0}{1}{2}为占位符
Console.WriteLine("计算完成!!!");
Console.WriteLine("========================");
Console.ReadKey(); //让程序等待
}
}
}
漏洞分析:
(1)程序存在的漏洞
如果输入的是空格、字母、什么都不输入等非数字字符,软件会崩溃,
(2)题目要求的是输入两个小于1000的正整数,这里输入两个负数照样会等到结果,这叫不符合客户的要求
namespace MyCalculator01
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("我的计算器"); //Console.WriteLine()输出后带回车的
Console.WriteLine("========================");
InputNum01: //标签
Console.Write("请输入第一个数字:"); //Console.Write()不带回车
string str01 = Console.ReadLine();
//判断有没有输入(空格也算没有输入)
if (str01.Trim().Length == 0)
{
Console.WriteLine("没有输入有效的字符!");
goto InputNum01;
}
InputNum02: //标签
Console.Write("请输入第二个数字:"); //Console.Write()不带回车
string str02 = Console.ReadLine();
//判断有没有输入(空格也算没有输入)
if (str02.Trim().Length == 0)
{
Console.WriteLine("没有输入有效的字符!");
goto InputNum02;
}
//Console.WriteLine("计算结果:{0}+{1}={2}",num01,num02,num01+num02); //{0}{1}{2}为占位符
Console.WriteLine("计算完成!!!");
Console.WriteLine("========================");
Console.ReadKey(); //让程序等待
}
}
}
6. 代码书写规范
1)代码中所有的标点都是英文半角
2)每一行代码以分号结束
3)所有代码书写大小写敏感
4)通过fF5来运行所写的程序
5)可通过生成解决方案来帮助我们来排查语法错误
7. 添加进来的类库要注意框架的匹配
添加进来的类库.NET FRAME框架低于现有项目的版本问题不大,最主要是怕高于现有项目的版本的
8. 进制转换
static void Main(string[] args)
{
//提示用户输入一个十进制数
Console.WriteLine("请输入一个十进制的数:");
int num01 = Convert.ToInt32(Console.ReadLine()); //把从键盘接收的数据转换成int
Console.WriteLine("{0}的二进制数为:{1}", num01, Convert.ToString(num01,2));
//{0}{1}为占位符,Convert.ToString(num01,2)的第二个参数为2就表示二进制
Console.WriteLine("{0}的十六进制数为:0x{1}", num01, Convert.ToString(num01, 16));
//{1}占位符前面加个0x来标识十六进制数
Console.ReadKey();
}
9. 如何存储
内存存储的最小单位(bit,简称b),一位只能存储一个二进制的0或者1
内存分配空间的最小单位是一个字节(Byte,简称B),连续8个bit就是一个Byte
10.编码表
汉字编码表GB2312(1980) 对ASCII码的一个扩充。
Unicode(1994) 包括了全球的语言
UTF-8 对Unicode的一个优化
11.数据类型
(1)整型
类型 长度(bit)
sbyte 8
byte 8 0~255
short 16
ushort 16
int 32
uint 32
long 64
ulong 64
选择数据类型原则:在满足存储数据基本容量要求的情况下,尽量节约空间
例如:存储年龄用long就不合适,太浪费了
用byte最合适,
(2)浮点类型
类型 长度(bit) 精度 定义和赋值
float 32 7位(指的是有效数字) float i = 12.5F
double 64 15~16位 Double i = 15.5D
decimal 128 28~29位 Decimal i = 12.5M
Decimal类型具有更高的精度和更小的范围,这使它适合财务和货币计算
static void Main(string[] args)
{
float num01 = 3.1415926F; (注意赋值时要带F,默认是Double类型,不写的情况)
Console.WriteLine(num01);
Console.ReadKey();
}
结果:
3.141593 (精度为7位,包括了小数点前面的)
static void Main(string[] args)
{
float num01 = 3.1415926F;
double num02 = 3.144544444444785D;
decimal num03 = 3.1454574876531454666M;
Console.WriteLine(num01);
Console.WriteLine(num02);
Console.WriteLine(num03);
Console.ReadKey();
}
保留两位小数的两种方法:
可以四舍五入
static void Main(string[] args)
{
float num01 = 3.1495926F;
double num02 = 3.146544444444785D;
decimal num03 = 3.1454574876531454666M;
Console.WriteLine(num01);
Console.WriteLine(num02);
Console.WriteLine(num03);
Console.WriteLine(num02.ToString("0.00"));
Console.WriteLine(num02.ToString("F2"));
Console.WriteLine(Math.Round(num02,2));
Console.ReadKey();
}
结果:
3.15
3.15
3.15
(3)布尔类型
类型 说明 值
布尔类型(bool) 8位 True或者False
(4)字符、字符串
char --字符 --一个字母,数字,符号,中文
char c1 = 'a'
string str01 = "我爱中国"
类型 长度 取值范围 注意
Char(字符型) 16位 双字节编码的任意符号 单引号表示,比如:'1'、','
String(字符串型) 不限 所有unicode能表示的字符串 双引号表示,比如:"iLync.cn"
String的最大长度=2的28次方-1=268,435,455
(5)转义符
是由一个\+特殊字符组成,表示一个特殊意思
转义字符 字符描述 字符的unicode值
\n 换行 0x000A
\' 单引号 0x0027
\" 双引号 0x0022
\t 水平制表符 0x0009
\r 回车 0x000D
例如:
static void Main(string[] args)
{
//
String str01 = "我爱\n深圳";
System.IO.File.WriteAllText("D:\\111.txt",str01);
Console.WriteLine("写入成功!");
Console.ReadKey();
}
注意:文件111.txt中的内容并没有换行,转义字符\n在VS中是没有换行
但是要把它写入文件中要用\r\n
(6)@符号的功能
a.忽略转义字符
b.识别换行符
例如:
static void Main(string[] args)
{
string str01 = "共享目录\\Server01\txt";
Console.WriteLine(str01);
Console.ReadKey();
}
//这种情况字符串str01里面有两个转义字符了,分别是\\和\t
static void Main(string[] args)
{
string str01 = @"共享目录\\Server01\txt";
Console.WriteLine(str01);
Console.ReadKey();
}
//这种情况会原样输出:共享目录\\Server01\txt
注意:如果字符串里面有""的话,@也没有办法,还是会报错的
static void Main(string[] args)
{
string str01 = @"我叫"Edison"共享目录\\Server01\txt";
Console.WriteLine(str01);
Console.ReadKey();
}
//下面这种情况回车一并输出,不会报错,如果没有@的话是不能这么写的
static void Main(string[] args)
{
string str02 = @"深圳您好
我爱深圳";
Console.WriteLine(str02);
Console.ReadKey();
}
(7)日期时间类型
DateTime--用来表示日期时间类型
//获取系统当前时间
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
Console.ReadKey();
}
static void Main(string[] args)
{
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
Console.WriteLine(dt.ToLongDateString());
Console.WriteLine(dt.ToShortDateString());
Console.WriteLine(dt.ToShortTimeString());
Console.WriteLine(dt.ToString("yyyy年MM月dd hh时mm分ss秒")); //自定义类型
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
Console.WriteLine(dt.ToString("yyyy-MM-dd"));
Console.ReadKey();
}
//时间也可以参与运算
(1)单行注释 //注释内容
(2)多行注释 /*注释内容*/
(3)文档注释 /// 让某一个类或方法在被调用的时候出现提示
13. 快捷键
(1)Ctrl+K+D 快速对齐 所选的代码段没有语法错误才能快速对齐
(2)Ctrl+J 快速弹出智能提示 不用重新加点
(3)F6 生成解决方案
(4)F5 运行调试
(5)Ctrl+K+C 注释所选代码
(6)Ctrl+K+C 取消对所选代码的注释
(7)shift+Home选中光标前面的内容 shift+End选中光标后面的内容 还可以配合上下键来用
14. region
用来折叠代码
使用方法:
#region
代码段
#endregion
15. 如何存储数据
调试时在及时窗口 &变量 查看变量的存储地址和变量值
byte num01 = 100;
string str01 = "我爱学习";
string str02 = "Hello";
double num02 = 3.1415926D;
bool b = false;
int num03 = 9600000;
Console.WriteLine(num01); //打印变量
Console.WriteLine(str01);
Console.WriteLine(str02);
Console.WriteLine(num02);
Console.WriteLine(b);
Console.WriteLine(num03);
Console.ReadKey();
16. 0x00 00 10 01在内存中的存取方法
先存低位0a,然后00 00 00
取的时候是先取高位 00 然后 00 00 0a
这就是栈,先进后出,后进先出
局部变量都是存在栈中的,01 10 00 00
[地址]
变量对应的地址就是0a所在的位置的地址。
开始的地址指向栈
(1)内存中的存储顺序和实际的字节表示刚好相反
比如:int i = 10,真实值:00 00 00 0a而存储在内存中0a 00 00 00
(2)负数的二进制数:对应的正数的二进制数每一位取反,再加1
int 型最高位表示符号:1表示负数 ,0表示正数
-127 :81 ff ff ff
例如:int num01 = -10
对应正数二进制: 0b 00000000 00000000 00000000 00001010
对应正数二进制取反: 0b 11111111 11111111 11111111 11110101
对应正数二进制取反加1:0b 11111111 11111111 11111111 11110110
对应的十六进制为: 0xff ff ff f6
内存中实际存储方式为: 0xf6 ff ff ff
(3)大写的X在内存中的存储
‘X’的对应ASCII为0x58
static void Main(string[] args)
{
char num01 = 'X';
Console.WriteLine(num01);
Console.ReadKey();
}
(4)汉字等存储相应的Unicode编码,占用2字节
static void Main(string[] args)
{
char num01 = '陶';
Console.WriteLine(num01);
Console.ReadKey();
}
(5)布尔类型
static void Main(string[] args)
{
bool b = true;
Console.WriteLine(b);
Console.ReadKey();
}
Bool类型值存储是0或者1,占用一个字节。True -> 01
17. 数据类型
(1)整型
类型 长度
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位
ulong 64位
12. 变量、输入输出
(1)使用规则:先定义(声明),再赋值,再使用
不定义就使用报错,定义了不赋值同样报错。
定义了,赋值了,但是不使用报警告。我也不建议这样搞,浪费内存空间。
结论:变量声明,赋值,使用三个步骤一个都不能少。
(2)C#变量名是区分大小写的
(3)camel书写方式,第一个单词首字母小写,其他单词首字母大写。
例如:stuName studentMaxAge
(4)输出
Console.WriteLine(输出内容) //输出后换行
Console.Write(输出内容) //输出后不换行
(5)输入
Console.ReadLine() //接收键盘输入的一个字符串,直到回车结束
static void Main(string[] args)
{
int num01 ;
Console.Write("请输入num01的值:");
num01 = Convert.ToInt32(Console.ReadLine()); //因为Console.ReadLine()返回的值都是字符型,
//即把键盘输入的那些当做字符,所以要转换成int
//接收直到回车时才结束
Console.Write("num01的值为:{0}",num01);
Console.ReadKey();
}
Console.Read() //输入一个字符,返回的是这个字符的编码值
//输入多个字符没有用,只会返回第一个字符的编码值
static void Main(string[] args)
{
Console.Write("请输入一个字符:");
int charCode = Console.Read();
Console.Write("你输入的字符为:{0}",charCode);
Console.ReadKey();
}
Console.ReadKey() //获取用户是否按下一个字符或者功能键
//没有获取就一直卡在这里
static void Main(string[] args)
{
Console.Title = "输入输出案例"; //设置Console标题
Console.WindowHeight = 20; //设置Console窗口的高度
Console.WindowWidth = 40; //设置Console窗口的宽度
Console.BackgroundColor = ConsoleColor.DarkGray; //设置背景颜色
Console.ForegroundColor = ConsoleColor.Yellow; //设置前景色
Console.Write("请输入姓名:"); //提示输入姓名
string str = Console.ReadLine(); //把键盘输入的字符串赋值给str变量
Console.ResetColor(); //重新颜色设置
Console.BackgroundColor = ConsoleColor.Green; //重新设置背景色
Console.ForegroundColor = ConsoleColor.Red; //重新设置前景色
Console.WriteLine("我的姓名是:"+str); //输出文字
Console.WriteLine("Press any key to Continue...");
Console.ReadKey();
Console.ReadKey(true);
}
(6)占位符
输出的时候先挖坑,然后通过后面的变量填坑
static void Main(string[] args)
{
string name = "张三", address = "上海市闵行区金都路18号";
int age = 34;
Console.WriteLine("我叫{0},我今年{1}岁了,我家住在{2}", name, age, address);
Console.ReadKey();
}
占位符的编号必须从0开始,然后1,2,3,4,5依次进行挖坑
挖的坑和填的坑数量保持一致,一一对应,注意:挖的坑有多少不是说这里的大括号有多少,而是指大括号里面
的数值有多少。
static void Main(string[] args)
{
//三心二意,一心一意,三阳开泰
Console.WriteLine("{0}心{1}意,{2}心{3}意,{4}阳开泰", '三', '二', '一','一','三');
Console.ReadKey();
}
里面有重复,可以合并,还可以这么写
static void Main(string[] args)
{
//三心二意,一心一意,三阳开泰
Console.WriteLine("{0}心{1}意,{2}心{2}意,{0}阳开泰", '三', '二', '一');
Console.ReadKey();
}
13. 变量类型转换
类型转换种类:
(1)自动类型转换,或者称为隐形类型转换,比如short转为int
static void Main(string[] args)
{
short num01 = 121;
int num02 = num01;
Console.WriteLine(num02); //可以自动转换
Console.ReadKey();
}
static void Main(string[] args)
{
float float01 = 3.1415F;
double double01 = float01;
Console.WriteLine(double01); //可以自动转换
Console.ReadKey();
}
(2)手动类型转换,或者称为强制类型转换(类型基本兼容),比如double转为float
static void Main(string[] args)
{
double double01 = 3.141592645D;
float float01 = double01; //无法自动转换,double转float精度丢失
Console.WriteLine(float01);
Console.ReadKey();
}
结论:如果是后面这种类型包含了前面的类型,不会出现数据的丢失,自动转换就没问题
否则就需要强制转换。
(3)手动类型转换,或者称为强制类型转换(类型不兼容)比如:string转为int
static void Main(string[] args)
{
int num02 = 1234;
string str01 = num02; //不能转换
Console.WriteLine(str01);
Console.ReadKey();
}
static void Main(string[] args)
{
int num02 = 1234;
string str01 = (string)num02;//也不行
Console.WriteLine(str01);
Console.ReadKey();
}
static void Main(string[] args)
{
int num02 = 1234;
string str01 = Convert.ToString(num02); //可以了
Console.WriteLine(str01);
Console.ReadKey();
}
(4)类型不兼容的类型转换
字符串->其他 Parse、TryParse
(5)其他->字符串 ToString()
(6)任意->任意 Convert
14. 变量的作用域
局部变量作用范围在{}内
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
string text = "Line" + i.ToString();
Console.WriteLine(text);
}
Console.WriteLine(text); //找不到text
Console.ReadKey();
}
static void Main(string[] args)
{
string text = "123";
for (int i = 0; i < 5; i++)
{
text = "Line" + i.ToString();
Console.WriteLine(text);
}
Console.WriteLine(text);
Console.ReadKey();
}
15.常量
常量的值在程序运行之前初始化的时候给定一次,
以后都不会变了,以后一直是这个值。
static void Main(string[] args)
{
const int num01 = 5;
num01 = 1; //局部常量不允许修改
Console.ReadKey();
}
static void Main(string[] args)
{
const double pi = 3.1415926D;
Console.WriteLine("请输入圆的半径:");
double radius = Convert.ToDouble(Console.ReadLine());
double perimeter = 2 * pi * radius;
double area = pi * radius * radius;
Console.WriteLine("半径为{0}的圆的周长为:{1}面积为:{2}", radius, perimeter, area);
Console.ReadKey();
}
窗体实现
private void btnCalc_Click(object sender, EventArgs e)
{
const double pi = 3.1415926D;
double radius = Convert.ToDouble(this.txtRadius.Text.Trim());
this.lblPerimeter.Text = (2 * pi * radius).ToString("F5");
this.lblArea.Text = Math.Round((pi * radius * radius),5).ToString();
}
第二季
1. 面向对象(OOP Object-Oriented Programming)
JavaScript C++ Python3 C# 都是面向对象编程
(1)面向对象的核心思想:
使用了许多代码的模块,每个模块只提供特定的功能,他们彼此独立,这样大大提高了
代码的重用几率,也更加有利于软件的开发、维护和升级
开发软件的本质就是为了记录信息、处理信息、存储信息、输出信息的过程
如何更好的“记录信息”是重中之重
没有填写数据的表格(比如员工入职登记表)就是类
每一个填完数据的表格就是一个对象
多个变量(和方法)的集合就是一个类
使用类描述的一个具体人就是对象
类:从本质上来讲也是一种数据类型,是多个基础数据类型的集合
class Program
{
static void Main(string[] args)
{
//张三,Abby
Person zhangsan = new Person();
zhangsan.name = "张三";
zhangsan.gender = "男";
zhangsan.birthday = Convert.ToDateTime("1995-03-01");
zhangsan.color = "黄";
zhangsan.job = "系统工程师";
zhangsan.nationality = "中国";
Console.WriteLine("姓名:{0},性别:{1},出生日期:{2},肤色:{3},职位:{4},国籍:{5}",
zhangsan.name, zhangsan.gender, zhangsan.birthday, zhangsan.color, zhangsan.job, zhangsan.nationality);
Console.ReadKey();
}
}
class Person //定义的类
{
public string name; //类的成员
public string gender;
public DateTime birthday;
public double height;
public string color;
public string job;
public string nationality;
}
class Program
{
static void Main(string[] args)
{
//张三
Person zhangsan = new Person();
zhangsan.name = "张三";
zhangsan.gender = "男";
zhangsan.birthday = Convert.ToDateTime("1995-03-01");
zhangsan.height = 1.75;
zhangsan.color = "黄";
zhangsan.job = "系统工程师";
zhangsan.nationality = "中国";
zhangsan.SayHello();
Console.ReadKey();
}
}
class Person //定义的类
{
//静态特征:字段(field)
public string name; //类的成员
public string gender;
public DateTime birthday;
public double height;
public string color;
public string job;
public string nationality;
//动态特征:方法(method) 其他语言我们叫函数
public void SayHello()
{
Console.WriteLine("大家好!很高兴认识大家,我叫{0},我是{1}生,我的出生日期为{2},我的身高为{3}m,我是{4}种人,我的工作是{5},我是{6}人"
, name, gender, birthday, height, color, job, nationality);
}
}