1)C#项目文件结构类型
-
Properties 文件夹 :项目版本信息定义,编译方式定义等
-
bin 文件夹 : 项目发布,生成文件夹
-
Debug 文件夹 :调试版本输出,含有断点调试信息等
-
Release 文件夹 : 运行版本输出
-
obj 文件夹 : vs开发编译缓存
注:Properties、bin、obj,这几个文件夹不需要程序员管理
-
*.config 文件: Asp.net 配置文件
-
appsettings.json : .Net Core 配置文件定义
-
.sln:解决方案文件,里面包含着整个解决方案的信息,可以双击运行。
-
.csproj:项目文件,里面包含着这个项目的信息,可以双击运 行。
2).net平台中的CLR
-
首先要说明的是,.NET平台与C#不是一回事 它是C#,VB.net等程序运行的平台。
-
CLR是公共语言运行时,是 .NET Framework的重要组成部分。它提供了内存管理、线程管理和异常处理等服务,而且还负责对代码实施严格的类型安全检查,保证了代码的正确性。
-
事实上,类型安全(Type Checker)、垃圾回收(Garbage Collector)、异常处理(Exception Manager)、向下兼容(COM Marshaler)等很多C#中的特性都是由CLR来提供的。
3)程序集
-
程序集文件类型 包含 exe 和 dll (动态链接库) exe 可手动执行文件 dll不可手动执行文件 dll包含程序中的功能
-
DLL文件反编译工具 通过ildsm.exe工具观察 dll文件内容
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools
4)命名空间
1、含义:命名空间是C#组织代码的方式 通常来管理类的方式 2、分类:系统命名空间和自定义命名空间 3、关键字:namespace 4、引用关键字:using.命名空间名称 5、包含:字段 属性 方法 构造函数 析构函数 事件 等..
5).为什么可以混合代码开发
1.CLR英文全称Common Language Runtime,即公共语言运行时 是.net
2.CLR为不同的编程语言提供了统一的运行平台,对于开发者来说,他们无需考虑平台运行问题,无论使用什么语言开发,最终都会编译成CIL
4.CIL(公共中间语言,COmmon Intermediate Language)。不同的高级语言最终会转化成CIL
5.CLR的主要目标就是为了让编程更简单,让开发者专注于直接需求
6).标识符
标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则:
标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。 标识符中的第一个字符不能是数字。 标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ' / \。 标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。 标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。 不能与C#的类库名称相同。
7).数据类型
数据类型分类 C#数据类型分为两大类:值类型和引用类型 整型类型 浮点型 字符型 布尔类型 struct( 结构 )、 enum(枚举 ) 字符串,类、接口、数组、集合,委托为引用类型
数据单位:位(bit) 又称 比特 、是计算机储存的最小单位,表示一个二进制
字节:1字节等于8位
1、ulong和long之间 无法使用 + - * / 。 (具有二义性)
1)数据类型转换
8)访问修饰符
public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员。 internal : 同一程序集中的任何代码都可以访问该类型或成员,但其他程序集不可以访问。 private : 同一类和结构的代码可以访问该类型和成员。 protected : 同一类和派生(继承特性)类中的代码可以访问该类型和成员。 protected internal : 同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型或成员。 private protected:该类型或成员可以通过从 class 派生的类型访问
9)C#的默认修饰符
类、结构体的默认修饰符是internal。 类中所有的成员默认修饰符是private。 接口默认修饰符是internal。 接口的成员默认修饰符是public。 枚举类型成员默认修饰符是public。 委托的默认修饰符是internal。
在命名空间内部或编译单元顶部的所有类型,默认修饰符是internal,可以人为改为public。
(1)访问修饰符:
①访问修饰符就是类,属性和方法的定义分级制度 。
②4个访问修饰符(是添加到类、结构或成员声明的关键字)
Public:公有的,是类型和类型成员的访问修饰符。对其访问没有限制。
Internal:内部的,是类型和类型成员的访问修饰符。同一个程序集中的所有类都可以访问
Private:私有的,是一个成员访问修饰符。只有在声明它们的类和结构中才可以访问。
Protected::受保护的,是一个成员访问修饰符。只能在它的类和它的派生类中访问。
protected internal:访问级别为 internal 或 protected。即,“同一个程序集中的所有类,以及所有程序集中的子类都 可以访问一个成员或类型只能有一个访问修饰符,使用 protected internal组合时除外。
private protected:该类型或成员可以通过从 class 派生的类型访问。
(2)类修饰符:
abstract:可以被指示一个类只能作为其它类的基类.
sealed:指示一个类不能被继承.
static:修饰类时表示该类是静态类,不能够实例化该类的对象,该类的成员为静态.
partial: 部分类
(3)成员修饰符
abstract:指示该方法或属性没有实现.
const:指定域或局部变量的值不能被改动(只能在声明时和构造函数里初始化)
event:声明一个事件.
extern:指示方法在外部实现.
override:对由基类继承成员的新实现.
readonly:只能在声明和构造函数中初始化
Partial:在整个同一程序集中定义分部类和结构
Virtual:用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象
New:作修饰符,隐藏从基类成员继承的成员,在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。作运算符,用 于创建对象和调用构造函数。
4)委托
delegate //在同一个类中委托的元素被方法使用
10)可变参数params
1.params是ParamArrayAttribute(参数数组属性)的缩写
2.param解决了C#中不定参数的传递的问题
3.params参数必须定义在参数列表最后面。
4.params必须对一维数组描述
5.params只能在一个方法中 定义一个一维数组
Main函数中执行:ProgramMothod(1,2,3,4,5,6,7);
1 表示函数中的参数a
2 表示函数中的参数b
(34567)则是params中的可变参数的parIntArray
private static void ProgramMothod(int a, int b,params int[] parIntArray)
{
int c = a + b;
foreach (int item in parIntArray)
{
c += item;
}
Console.WriteLine(c);
}
11)如何给值类型赋值为null
1、Nullable<int> intNumber = null;
2、int? intNumber = null;
总结:普通的值类型不能赋值为null
12)null和字符串空值和字符串空格的区别
1.null是没有创建内存空间,
2.字符串空值 为"" 或者string.Empty 实际上都会分配空间;
3.字符串空格 " " 会分配空间 空格也是ACSII 对应的符号
13)双问号 ??(合并运算符)
作用:
?? 运算符称作 null 合并运算符。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数
// y = x, 只有在x为null情况下 y = -1.
int y = x ?? -1;
14)Array类
1)含义: 是 C# 中所有数组的基类,它是在 System 命名空间中定义 提供了各种用于数组的属性和方法
//参数1:设置数组数据类型 typeof(int) 转化值类型 为Type类型对象
//参数2 数组的长度
//Array intArray = Array.CreateInstance(typeof(int), 5);
2);//创建二维数组
方法:SetValue(修改的值,一维数组索引,二维数组索引)
Getvalue(一维数组索引,二维数组索引)
15)字符串集合stringBuilder(可变字符串)
特点:
1.可以定义可变字符串,实现字符串的添加
2.对于高频率字符串拼接可以使用
3.如果普通拼接 可以使用上节课所以将的字符串格式化方式
常用方法:
Append 末尾追加
Insert 在指定位置插入指定字符串
Remover 移除指定字符串
16)Hashtable集合
Hashtable特点
有集合的特点
Hashtable集合通过键值索引对应的元素
Hashtable集合键值是唯一的
Hashtable创建
Hashtable ht = new Hashtable();
Hashtable方法
添加集合元素:ht.Add(键值,数据);(键值可以是数字或字符)
添加集合元素:ht[键值] = 数据;
访问集合元素:ht[键值];
判断集合键值是否存在:ht.Contains(键值); ht.ContainsKey(键值);
判断集合元素是否存在:ht.ContainsValue(元素);
获取集合键数组:ht.Keys;
17)、C#ArrayList和List的区别
ArrayList的缺点:存在装箱与拆箱,装箱与拆箱的过程是很损耗性能的
首先是本质上区别
1.List是一个接口,而ArrayList是一个类,它实现了List接口。 所以List不能被构造,List list=new List()这种写法是错误的,而ArrayList就可以被构造。 List list = new ArrayList();这句创建了一个ArrayList的对象后把向上转型成了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。 而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
1)List集合 (泛型集合)
List 与其他数组的比较: List与不可变数组(Array类)比较类似,都用于存放类型相同的元素。 List与可变数组(ArrayList)比较类似 元素长度不固定。 创建泛型集合对象 存储的元素类型为string
2.两者都是集合.
ArrayList t类型不安全,因为加入的数据为object类型,所以需要装箱与拆箱,效率较低。 List:声明时就决定了类型,所以是类型安全的,省掉了装箱与拆箱的过程,效率比ArrayList要高。
3.ArrayList就是一个List而已。 泛型集合的优势就是类型安全和无装箱。
List<string> list = new List<string>();
//新增数据
list.Add(“abc”);
//修改数据
list[0] = “def”;
//移除数据
list.RemoveAt(0);
18)装箱和拆箱
1)泛型和Object类型的区别
值类型转换成引用类型。这个转换称为装箱。相反的过程称为拆箱
int number = 10;
// 装箱
object obj = number;
// 拆箱
number = (int) obj;
C#中 Object 是一切类型的基类,可以用来表示所有类型
Object 类型 > 优点: > 1. object类型可以用来引用任何类型的实例; > 2. object类型可以存储任何类型的值; > 3. 可以定义object类型的参数; > 4. 可以把object作为返回类型。 > 缺点: > 1. 会因为程序员没有记住使用的类型而出错,造成类型不兼容; > 2. 值类型和引用类型的互化即装箱拆箱使系统性能下降
19)C# 排序列表(SortedList)
排序列表是数组和哈希表的组合
它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)
集合中的各项总是按键值排序
20)字典(Dictionary<string,int>)
C#中的Dictionary字典类 1.Dictionary 没有索引值 只有key/Value 2.key/Value都可以是任何类型 3.Dictionary是可变长度的集合 4.Dictionary是泛型的集合 定义对象时 要指定 key/Value的类型 5.通过key值查询value 且key值是唯一
//创建对象
Dictionary<string,int> keyValuePairs = new Dictionary<string, int>();
//添加元素
keyValuePairs.Add("0", 10);
keyValuePairs.Add("1", 20);
//遍历字典
foreach (KeyValuePair<string, int> item in keyValuePairs)
{
Console.WriteLine("Key = {0}, Value = {1}", item.Key, item.Value);
}
//通过key删除value元素
bool isSuccess = keyValuePairs.Remove("0");
bool isSuccess1 = keyValuePairs.Remove("3");
Console.WriteLine(isSuccess);
Console.WriteLine(isSuccess1);
//查询key是否存在字典中 有返回true 反之返回false
bool isTrue = keyValuePairs.ContainsKey("0");
//清空
// keyValuePairs.Clear();