目录
.NET Framework是什么
.NET Framework是一个由微软设计和开发的软件框架,主要用来开发可以在Windows上运行的应用程序,框架中提供了包括网络,安全性,内存管理和类型安全在内的各种服务。并且它还支持60多种编程语言。
.NET Framework的构成
- 公共语言运行库(CLR)
- 框架类库(FCL)
- 核心语言(WinForms、ASP.NET和ADO.NET)
- 其他模块(WCF 、 WPF 、WF等)
公共语言运行库(CLR)
它为.NET应用程序提供了一个托管的代码执行环境(类似java中的虚拟机),是整个框架的核心,实际上CLR是驻留在内存里的一段代码,负责程序执行期间的代码管理工作,例如有内存管理,线程管理,安全管理,远程管理,即时编译等
CLR组成
Base Class Library Support
Thread Support COM Marshaler
Type Checker Exception Manager
Security Engine Debug Engine
IL to Nation Compilers Code Manager Garbage Collector
Class Loader
- Base Class Library Support(基础类库)
- Thread Support (线程支持)
- COM Marshaler(COM封送处理程序)
- Type Checker (类型检查器)
- Exception Manager(异常管理器)
- Security Engine(安全引擎)
- Debug Engine
- IL to Nation Compilers
- Code Manager(代码管理器)
- Garbage Collector(垃圾回收器)
- Class Loader(类加载器)
框架类库(FCL):是一个标准库,包含成千上万个类,主要用于构建应用程序。FCL的核心是BCL,BCL提供了FCL的基本功能,
C#是什么
由微软开发并获得ECMS和ISO批准的现代的、通用的、面向对象的编程语言
特点:
- C#是一种现代化的通用编程语言
- C#是面向对象、面向组件的
- C#简单易学
- C#是一种结构化语言
- C#开发效率高
- C#可以在各种平台上进行编译
- C#是.Net Framnework的一部分
C#与C的区别于java的区别
C是面向过程的,C#是面向对象的
- Java是Oracle开发的一种高级、健壮、安全和面向对象的编程语言,C#是微软开发的在.Net Framework上运行的一种面向对象的编程语言
- Java语言需要在Java运行环境(JRE)下运行,C#语言需要在公共语言运行库(CLR)上运行
- Java是类型安全的,C#不是类型安全的
- Java中只支持在创建数组时定义数组大小或给数组赋值,不支持在创建数组时即定义数组大小又给数组赋值,C#支持在创建数组时即定义数组大小又给数组赋值
- Java中,按值传递的内置数据类型称为原始类型,C#则称为简单类型
- Java不支持条件编译,C#支持使用预处理程序指令进行条件编译
- Java不支持goto语句,C#支持
- Java不支持structures(结构体)和unions(联合体),C#支持
- Java支持checked exception和 unchecked exception,C#仅支持unchecked exception
C#开发环境
.Net Framework 是一个平台,它提供了一个跨语言的统一编程环境,在这种平台上使用的开发语言有很多如Visual Basic .NET、Python、J#等
Visual Studio 下载和安装
官网下载Visual Studio 的安装程序,选择社区版可以免费使用
选择 .NET desktop development (.NET桌面开发) ,然后选择install进行安装
最后通过File 菜单来创建C#应用程序
之后下一步创建进入
测试一下项目是否能正常运行
放入Button按钮,属性窗口,点击右上角的闪电图标,然后直接双击按钮。
创建应用台控制程序
运行出的第一个程序
C#程序结构
using System;//using关键字用来在程序中引入System命名空间,一个程序可以有多个using语句
namespace ConsoleApp1 //namespace关键字用来声明一个命名空间,后面是命名空间的名字
{
internal class Program
/*C#中的internal访问修饰符表示 访问仅限于当前程序集
但是注意,internal修饰符修饰的类中,可以有public的成员变量和成员方法等
class 关键字用来定义一个类, Program则为类名,类中通常用来存放程序中要使用的数据和函数(方法)*/
{
static void Main(string[] args)
{
Console.WriteLine("Hello world");
/*WriteLine是System命名空间中定义的Console类里面的方法*/
Console.ReadKey();
/*针对VS.NET用户,它会使程序进入等待状态,因为命令行窗口会在程序运行结束后自动关闭,会导致我们想要输出的内容闪过,加此行代码可以避免这种情况*/
}
}
}
注意
- C#区分大小写,所有语句和表达式必须以英文分号结尾
- 程序从Main开始执行,
- 与java不同的是,程序文件名可以与类名不同命
- { }成对出现
C#基本数据类型
数据类型:值类型、引用类型
值类型:简单类型、复合类型
引用类型:预定义类型、自定义引用类型
简单类型:整数类型、浮点类型、布尔类型、字符类型
复合类型:枚举类型、结构类型
预定义引用类型:object string
自定义引用类型:数组、类、接口、委托
值类型:直接存储值
int age=30; int age2=age; 这个值存储在栈里面,我们访问age是直接访问,操作的话就是直接对栈里的值进行操作。值类型必须要有确定的值
类型 | 说明 | 范围 |
sbyte | 8位有符号整数占用1个字节 | -128~127 |
short | 16位有符号整数 | -32768~32767 |
int | 32位有符号整数 | -2147483648~2147483647 |
long | 64位有符号整数 | -9223372036854775808~ 9223372036854775807 |
byte | 8位无符号整数 | 0~255 |
ushort | 16位无符号整数 | 0~65535 |
uint | 32位无符号整数 | 0~4294967295 |
ulong | 64位无符号整数 | 0~18446744073709551615 |
类型 | 说明 | 范围 |
float | 精确到7位数 | +-1.5*10^-45~+-3.4*10^38 |
double | 精确到15~16位数 | +-5.0*10^-324~+-1.7*10^308 |
decimal | 精确到28位数 | +-1.0*10^-28~+-7.9*10^28 |
bool类型:true,false需要使用布尔关键字,C#中默认布尔值为false
bool不能够和其他类型进行转换
char类型用单引号,string类型用双引号
char类主要存储单个字符16位占2个字节,一个汉字占两个字节
‘男’汉字字符 ‘m’字母字符 ‘4’数字字符
using System;
namespace FtoC
{
class Program
{
static void Main(string[] args)
{
ReferenceAndValue.Demonstration();
Console.ReadLine();
}
}
//定义一个类
public class stamp
{
public string Name { get; set; }//定义引用类型
public int Age { get; set; }//定义值类型
}
public static class ReferenceAndValue //定义静态类
{
public static void Demonstration()//定义静态方法
{
stamp Stamp_1 = new stamp { Name = "Premiere", Age = 25 };
stamp Stamp_2 = new stamp { Name = "Again", Age = 47 };
int age = Stamp_1.Age;//结果是25
Stamp_1.Age = 22;//这个并不改变小age
stamp Stamp_3 = Stamp_2;
Stamp_2.Name = "Again Amend";
Console.WriteLine("Stamp_1's age:{0}", Stamp_1.Age);
Console.WriteLine("age's value:{0}", age);
Console.WriteLine("Stamp_2's name:{0}", Stamp_2.Name);
Console.WriteLine("Stamp_3's name:{0}", Stamp_3.Name);
//值类型在栈里面存储,引用类型是放在堆里面的,
}
}
}
常量:不能被改变的量
字面常量和符号常量(const)
在C#中要注意变量的命名规则,变量名是由数字,字母和下划线组成,首字母只能是字母或下划线,关键字不能作为变量名.
变量声明:
变量类型 变量名=数值; int money = 1000;
变量类型 变量名;
变量名 = 数值;
变量类型 变量名1,变量名2;
表达式与运算符:
表达式是由操作数和运算符所构成的
按操作数个数:单目运算符、双目运算符、三目运算符(?:)C#中唯一的一个条件运算符
按运算符功能:算术运算符、自增自减运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符。
基本的算术运算:(-6.5) %(-2)=-0.5
使用%运算符时,返回结果的符号与左操作数相同
在做除法或取余运算时,分母不能为0,直接抛出异常,C#中包含异常处理机制。
a++先赋值a后自增相当于a=a+1,++a先自增再赋值, --a相当于a=a-1,
自增自减只能作用于变量不能是常量也不能是表达式
复合赋值运算符:a+=3; 是将其赋值运算符与其他运算符合并成一个运算符来使用
关系运算符:经常在判断语句和循环语句中使用
测试题笔记:
将变量从字符类型转换为数值类型可以使用的转换方法是int.Parse()
表达式类型转换有三种:
隐式转换,显式转换(((int)m),(convert To int32(m),int.Parse(将字符转换为数值))
装箱:是隐式转换,系统直接转换
拆箱:显式类型转换
标识符:由数字、字母和下划线组成,首字母必须是字母或下划线
先判断条件的当循环语句是:while
do...while先执行,后判断,while...do,没有这个语句,大括号代替了do
continue语句结束循环体的一次执行,不跳出循环
break 跳出循环,不再执行循环语句
在switch语句中,每个语句标号所含关键字case后面的表达式必须是常量表达式(常量值)
switch后面跟判断参数
在while循环语句中,一定要有修改循环条件的语句,否则,可能造成死循环
数组
一维数组是具有相同数据类型的一组数据的线性集合,在程序中可以通过一维数组来完成一组相同数据类型数据的线性处理
多维数组是指可以用多个下标访问的数组,声明时,方括号内加逗号,就表明是多维数组,有n个逗号,就是n+1维数组
C#中的数组是由System.Array类派生而来的引用对象
using System;
using System.IO.IsolatedStorage;
class Program
{
static void Main(string[] args)
{
int[,] MatrixEin = new int[3, 3] { { 2, 2, 1 }, { 3, 3, 1 }, { 4, 4, 1 } };
int[,] Matrix2wei = new int[3, 3] { { 0, 1, 2 }, { 0, 1, 1 }, { 0, 2, 1 } };
int[,] MatrixResult = new int[3, 3];
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
for(int k=0;k<3; k++)
{
MatrixResult[i,j]+=MatrixEin[i,k]*Matrix2wei[k,j];
}
}
}
Console.WriteLine("两个矩阵的乘积是:");
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
Console.WriteLine(MatrixResult[i,j]);
}
Console.WriteLine();
}
Console.ReadLine();
}
}
面向对象3-1
using System;
class Program
{
static void Main(string[] args)
{
Program prgrame=new Program();//首先实例化
Console.WriteLine("请输入年龄");
prgrame.Age=Convert.ToInt32(Console.ReadLine());
if (prgrame.Age == 0)
{
Console.WriteLine("请重新输入");
prgrame.Age = Convert.ToInt32(Console.ReadLine());
}
}
private int age;//定义字段
public int Age//定义属性
{
//get只读属性set只写属性
get { return age;
Console.WriteLine("输入正确!\n字段age={0}", age);
}
set
{
if (value > 0 && value < 130)
{
age = value;
Console.WriteLine("输入正确!\n字段age={0}", age);
}
else
{
Console.WriteLine("输入数据不合理");
}
}
}
}
构造函数和析构函数
构造函数和析构函数是类中比较特殊的两种成员函数,主要用来对对象进行初始化和回收对象资源。对象的生命周期从构造函数处开始,在析构函数处结束。如果一个类含有构造函数,在创建该类的对象时就会调用,如果含有析构函数,则会在销毁对象时调用。构造函数和析构函数的名字和类名相同,但析构函数要在名字前面加一个波浪号(~)。档推出含有该对象的成员时,析构函数将会自动释放这个对象所占用的内存空间。
构造函数具有与类名相同的名称,它通常初始化新对象的数据成员。
1.对象的创建:
对象可以被认为是在一类事物中抽象出来的某一个特例,通过这个特例来处理这类事物出现的问题。在C#中通过new操作符来创建对象。
访问对象的属性和行为:
internal class Program
{
private static void Main(string[] args)
{
cStockInfo si=new cStockInfo();
si.FullName = "笔记本电脑";
si.ShowGoods();
Console.ReadLine();
}
public class cStockInfo
{
private string fullname = "";
public string FullName
{
get { return fullname; }//可读可写属性包含get和set访问器
set { fullname = value; }
}
public void ShowGoods()
{
Console.WriteLine("库存商品名称:");
Console.WriteLine(FullName);
}
}
}
2.方法的参数