C#总结:.NET, 数据类型, 访问修饰符, 各部分的定义(一)

Evernote Export

 

 
.................................. .Net框架 ...................................
 
.Net [ .Net框架 /.NetFramework ]
.NET多语言支持
 
源程序 -->通过CIL(公共中间语言)编译成程序集 [能被.Net框架认识] --> 通过CLR(公共语言进行时)进行二次编译 --> 机器码 [能被计算机识别]
C#源程序在被编译为程序集以后,就独立于C#,因此程序集可以由其他种类的语言所调用;
同时,因为程序集并没有包含本地机器的指令,所以它与具体的机器类型也分隔开了,可以被装有.NET框架的任何机器运行
 
1. CIL/IL(Common Intermediate Language,公共中间语言):
公共:类似精通各种语言的翻译,将各种语言翻译成.Net大老板能识别的东西
中间:翻译成.Net大老板能识别的东西但并不能直接被计算机识别,只能是.Net老板识别,需要通过CLR二次编译成机器码
语言:也是一种语言,不过是比C#更低级一点的语言;也可以直接编写 CIL语言的程序,只不过效率低
因为程序集都是由 CIL语言描述,所以CIL也叫程序集语言;又因为CIL代码需要在.Net平台下运行,所以CIL语言又叫 托管语言
 
2. CTS(Common Type System):公共类型系统
定义了一套CIL语言的规则;若要自己创建一个类似C#,运行在.Net的语言,即要符合CIL的规则 CTS,
例如:所有类型都隐式地继承自System.Object类型,所有类型都只能继承自一个基类
 
3. 程序集:C#源程序经过编译后生成的结果文件叫程序集,分为.dll(类库)或.exe(可执行程序)
包含多个命名空间,每个命名空间包含 元数据[IDE通过元数据感应,打出".",自动弹出菜单] 和 CIL[元数据的实现]
 
4. CLR(Common Language Runtime,公共语言进行时):
将程序集进行二次编译成计算机能识别的 机器码
 
5. BCL: 基类库;包含mscorlib.dll[ 定义数据类型,字符串等 ],会被自动引用,
6. FCL:.Net框架自带的类库;BCL是FCL的一个子集
 
string类和 String类的区别:
基元类型:属于BCL[即.Net框架]而非某个编程语言的数据类型
如: System.Byte,System.Int16,System.String
C#中的string是映射到 基元类型String,所以没有区别
 
 
基类[父类]、派生类[子类];继承某个类,实现某个方法 [ 一般是指abstract抽象类,没有实体的方法 ]
GC: 垃圾回收机制 [Garbage Collection]
 
Web服务:RPC以及其他 -> WCF (SOAP) -> Web API (REST) -> Web API 2 (REST)
Web应用: ASP -> ASP.Net -> ASP.NetMVC -> ASP.Net Code
数据库:ADO.Net -> ADO.NetEntityFrameWork(ORM)
异步编程:委托 -> 事件 -> 任务 -> 任务语法糖
 
 
程序集和命名空间:
一个程序集[DLL文件],被逻辑上划分为多个命名空间,一个命名空间用来存储多个类 [ 命名空间的概念是为了区分同一个程序集中同名的方法,变量 ]
--- 跟一块硬盘划分为多个盘符一样的原理
 
 
 

 
.................................. C#的数据类型 ...................................
C# 语言是一种强类型语言,要求每个变量都必须指定数据类型
C# 语言的数据类型分为 值类型 和 引用类型 两种
 
值类型
引用类型
父类
1.都继承于System.Object 的子类System.ValueType;
2.存储在栈中
3.声明的时候不管是否赋值,编译器在栈中就已经分配了内存,
4.栈直接存储数据
1.都继承于 System.Object;
2.存储在 栈和堆中
3.声明的时候,只是在栈中分配一小片内存,
创建实例时,在堆上分配空间并将堆上的空间地址存储到栈中的内容
4.栈中存储的是引用[地址],堆中存储数据
 
 
Student stu = newStudent();
1. 先在栈中开辟一块类型为Student的内存空间放置变量stu
2. 调用类的构造函数创建类的对象 newStudent(),存储在堆中
stu指向 这个对象
范围
整型[short,int,long], 浮点型[float,double]
字符[char], 布尔[bool], 结构体[struct], 枚举[enum]
类类型[class], 字符串[string],数组[array]
抽象类[abstract] 接口[interface], 委托[delegate]
默认值
0
NULL
能否被继承
值类型不能被继承[如:结构体]
引用类型可以被继承
复制
int a = 10;
int b = a;
a,b相互独立[深复制]
A a = new A();
A a2 = a;
[浅复制]:堆中只有一个A实例,a和a2都执行它,
改变a中某个成员的值,a2的成员也会改变;
int a = 12;
object o = a;[装箱]这个值类型被复制并分配到堆中,并把它转换为引用类型
int b = (int)o;[拆箱]引用类型被复制到栈中,并把它转换为值类型
拆箱:必须用装箱时的类型来拆箱 [装箱时是int,拆箱时只能用int]
 
整形: byte 类型[字节型]、short 类型[短整形]、int 类型[整形]、long 类型[长整形],并分别定义了有符号数和无符号数
有符号数可以表示负数,无符号数仅能表示正数 ==> 除了byte是无符号数,其他都是有符号数,1byte = 8bit,1个byte的范围 0~255
溢出: byte a = 255; a+=1; ==> a =0 a+=2; ==> a=1
 
浮点型:精度浮点型 float ,双精度浮点型 double,高精度 decimal
C# 语言中默认的浮点型是 double 类型
使用单精度浮点型
 
字符:char,使用单引号括起来;
它占用两个字节;能存放一个字符,能存放一个汉字
 
字符串:string,使用引号括起来;
不定长;由于在声明字符串类型的数据时需要用双引号将其括起来,双引号就成了特殊字符,不能直接输出,转义字符的作用就是输出这个有特殊含义的字符
 
 

 
.................................. C#数据类型之间的转换 ...................................
1.数值类型之间和装拆箱 2.任何类型和字符串类型之间 3.任何类型和任何类型之间
 
隐式转换
整型 ---> 浮点型 / 任何类型 --> object[装箱]
 
显示转换 [强制转换]
变量名 =(数据类型)变量名/值
浮点型 ---> 整型
数据类型要兼容
int a = (int)3.99; //转换为int时,舍去小数位
int b =(int)enumE.a; // [枚举类型转换为 int ]
装箱 和 拆箱
装箱:值类型 -->引用类型 [ 隐式转换 ]
拆箱:引用类型 ---> 值类型/引用类型 [ 显示转换 / as ]
[ 一般都是 object类型,也没见过其他类型 ]
object a = "1";
string b = (string)a;
string c = a as string;
装箱:是隐式转换,任何类型都可以转换为object,不管什么东西都往箱子里面扔
拆箱:要有对应的钥匙,才能打开箱;要转换为对应的类型
 
XXX.ToString( )方法
ToString是Object中方法,任何类型都继承Object
任何类型 ---> 字符串类型
string a = 123.ToString();
static XXX.Parse(string s) [ 拆箱 ]
字符串类型 ---> 任何类型
转换成功返回结果,不成功抛出异常
i = int.Parse("2.3" );
//2.3超过int的取值范围
static bool TryParse(string s, out int/bool/. result)
字符串类型 ---> 任何类型
转换成功返回true,结果存储在 result 中
int i;
if(int.TryParse("2.3", i)==true)
Convert.ToXXX(object obj)
任何类型 ---> 任何类型
int a = Convert.ToInt16(‘2‘);
//ToInt16(short)/ ToInt32(int) /ToInt64(long)
 

 
.................................. C# 的访问修饰符 ...................................
public:公共类型; internal:内部类型,同一个程序集; protected:保护类型,类和子类中;
internal protected:内部保护类,同一程序集中的类,所有程序集中子类; private:私有类型,类中
 
默认访问修饰符
可选择访问修饰符
类/静态类成员
private
public,intarnal, protected, internal protected, private
结构成员
private
public, internal, protected, private
接口成员
public
none
[接口的用途是让其他类能够访问,所以接口成员都是 public类型]
枚举成员
public
none
[枚举成员始终都是 public类型]
 

 
.................................. C# 各部分的定义 ...................................
XXX的定义:
访问修饰符 XXX的修饰符 数据类型 XXX名
类的定义
访问修饰符[ public/internal ] 修饰符[ sealed/static/abstract] 数据类型为class 类名
 
  1. 变量初始化无法引用 非静态字段,方法和属性 staticintvarc = vari + varj;
  2. 类下只能进行初始化操作,不能进行操作运行,操作要方法方法里面,
比如在类下只能初始化类[即是创建类的变量];引用静态类的静态成员 和 引用类的实例成员 都需要写在方法里面
 
字段的定义
访问修饰符[ public/internal/protected/private ] 字段修饰符(static/readonly/const) 数据类型 字段名
 
属性的定义
访问修饰符[ public/internal/protected/private ] 属性修饰符(static/abstract) 数据类型 属性名
 
方法的定义
访问修饰符[ public/internal/ptotected/private ] 方法修饰符(static/abstract/virtual/override/sealed override:子类中)
数据类型[返回值类型] 方法名
 
构造函数
访问修饰符[ public/internal/ptotected/private ] 构造函数修饰符(static) 与类同名 --- 访问修饰符和构造函数修饰符只能出现一个
 
  1. 构造函数:一般访问类型是 public,没有返回类型,与类同名的方法; 默认类型为 private,如果不扩大访问类型,就不能访问创建类对象
  2. 静态构造函数默认是public;不允许出现访问修饰符,参数,
 
 
静态类的定义
访问修饰符[ public/internal ] 修饰符为static数据类型为class 类名
 
字段属性方法
访问修饰符[ public/internal/protected/private ] 修饰符(static) 数据类型 字段名/属性名/方法名/构造函数
 
构造函数
修饰符(static) 类名 --- 静态构造函数默认是public;不允许出现访问修饰符,参数,
抽象类的定义
访问修饰符[ public/internal ] 修饰符为abstract数据类型为class 类名
 
成员定义都和通用一样,只是 方法中的 abstract方法和 virtual方法, 虚拟成员不能为私有的
 
抽象属性
访问修饰符[ public/internal/protected ] 属性修饰符为abstract 数据类型 属性名;
 
抽象方法
访问修饰符[ public/internal/protected ] 方法修饰符为abstract 数据类型[返回值类型] 方法名(); 不能有实体,必须被重写
 
虚方法
访问修饰符[ public/internal/protected ] 方法修饰符为virtual 数据类型[返回值类型] 方法名(); 必须有实体,可以被重写
密封类的定义
访问修饰符[ public/internal ] 修饰符为sealed 数据类型为class 类名
结构的定义
访问修饰符[ public/internal ] 结构修饰符为sealed且默认隐藏掉 数据类型为struct 结构名 [结构是密封类]
枚举的定义
访问修饰符[ public/internal ] 枚举修饰符为static且默认隐藏掉 数据类型为enum 枚举名 [枚举是静态的常量集合]
接口的定义
访问修饰符[ public/internal ] 数据类型为interface 接口名 [接口是特殊的抽象类] --- 跟属性一样,只是数据类型为 interface
 
不能有构造函数,不能有字段, 由 方法,属性,事件,索引器 *组合
 
成员
数据类型 属性/方法/事件名 [结构是密封类]
interfaceICompute
{
intId { get; set; }
stringName { get; set; }
voidTotal();
voidAvg();
eventEventHandler AddDetail;
}
 
 
 
作者:大李子
邮箱:1185241994@qq.com
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
 
 

C#总结:.NET, 数据类型, 访问修饰符, 各部分的定义(一)

上一篇:如何在 C# 中使用 const,readonly,static


下一篇:Nginx+Gunicorn+Supervisor 部署 FastApi 项目