C#复习笔记

第一天笔记:.NET是一个平台
c#是语言 我们可以通过.NET平台 来编译 部署 运行 C#程序
在.net平台上运行的 统称.nET语言
//
csc命令 检测源码是否符合C#语法规范 符合就编译成EXE文件 否则报错
exe文件 可以叫做程序集 当不是所有的都叫程序集
通过CSC命令编译成EXE文件的才叫程序集 .DLL也叫程序集
程序集由MSIL(微软中间语言)组成 CLR中的jit 即使编译器 把MSIL转成2进制代码 (即本地平台的cpu指令)并让CPU执行
//
为什么不直接由微软中间语言直接变2进制代码呢?
为什么要经过这么多步骤 我觉得可能是CPU不一样 所以不同的JIT在不同的CPU里面转化成不同的CPU指令(转化的时候先判断CPU类型)
//
在工具 代码断管理器 可以自己定义代码断哦· 很爽的嘿嘿
CPU先由硬盘拷贝到内存 应为内存访问速度特别快
//
数据类型 就是在内存中开辟空间大小的一个模版 int double string char byte short bool
//
微软事先规定好的类型 统称预定义类型
//
变量名 本质是为这个空间取的别名
变量类型 就是这个空间的数据类型
变量的值 就是这个空间的值
//
切记 如果不用参加运算的数字 尽量用字符串
参加运算的数字 选择最适合的类型·
//
赋值规范 两边数据类型兼容
一个变量只能存一个值
变量使用时 必须为变量赋值//我觉得如果不赋值的话 他本身是一个地址 而输出别名是输出值
//
隐式转化 满足条件1.数据类型兼容 2.目标类型大于源类型
字符串 如果是int 类型的 就可以转化成int 而且范围小于 int 类型 parse只能转字符串
隐式强制转化是内存意义的转化 就是切割 以及硬塞进去的转化咯
//
convert是根据变量的意义转化
//
c#万物皆对象- - 好装B 我喜欢·
//
parse convert 有什么区别
parse 如果是空(null)的 就报错抛异常
concert 先判断是否为空 是空 直接返回 0 不报错 否则 调用 parse 方法
//
值传递 是COPY一份哦·数值类型 char boo 枚举 结构 栈里面直接存储 0
//
引用传递 数组 字符串 类 先在栈里面开辟一个接受的地址的变量的类型 真实的对象 存储在堆里面 null
//
字符不能包含空的字符 但是可以为空格
//
方法的参数是属于这个方法的一个局部变量
//
局部变量使用之前必须赋值
//
方法的参数如果有默认值 可以在调用这个方法的时候 不给这个方法赋值
//
参数的默认值 必须在最右边
//
参数的类型必须一致 ·参数个数可以不一致(有带默认值的参数) 顺序可以不一直(变量名:赋值)
//
第二天:
一维数组 ,长度是不能改变的 一条线
//
数组有一个数学 length 表示元素的个数
//在内存里面 实际上是开辟了一条 连续的空间
二维数组 , int[,] arr=new int[2,3]; 一个面 好饿- -我想吃早点了
若不对数组元素赋值 数组类元素默认为0
foreach 不能得到下表不能改值
//
getlenggth()获取一维 二维 N维的长度·
//
rank获得数组的维数
//交错数组
int[][] arr=new int[3][] 只需要直到前一个中括号里面的值
交错数组的本质是一个一维数组 只是一维数组的元素 又是一个数组
//
方法重载的需求
1.方法的名字一样 2方法参数的个数 或类型不一样 3.参数的顺序不一致 这些方法必须在用一个类中
与返回值无关
//params
被params修饰的 是不可以有默认值的
参数被params修饰就可变参数 修饰的只能是一个一维数组
如果你传元素 他自己帮你封装成一个数组 在帮你传递
并且params可以什么都不传 应为数组的长度可以为零哦
可变参数 只能放到最后
//ref修饰的 传递的是该变量的地址哦·
ref 在使用钱必须赋值
应为在方法内不一定会为他赋值
ref修饰方法参数在调用时 必须在变量前面加上REF ,而且只能传递变量不能传递常量
为什么呢?
很简单 一个常量 你怎么确认他的地址? 只有变量名才有地址
ref 可以修改 也 可以不修改 侧重修改 可能修改 可能不修改
//out 传递的是地址哦· 侧重输出
OUT 必须在方法内为参数赋值
out 在传递之前可以不为他赋初值 应为在方法内必须赋值
应为OUT可能不用 而ref 可能会用到这个值
//
执行者到指挥者

//类与对象的关系
类是对一类事物的统称·
对象是具体存在的
对象是根据类这个模版创建出来 类拥有的功能特效 对象也有 并且一样 不多不少
变量 只有一个单词全部小写 多个的话 首个单词后面的单词首字母大写
命名要有意义
变量名是名次
方法吗 首字母大写 是动词
类名 首个字符大写 是名词
//
1在内存中开辟一块合适的大小空间
在这个空间创建对象
调用这个对象的构造函数
返回这个空间的引用地址
//
类的成员访问修饰符 字段和方法咯·
public 在任意地方访问
private 类的内部访问
protected 在本类和本类的子类中访问
internal 当前程序集中访问
默认 private
执行代码写在方法里面
类下面可以定义 字段方法
//
类的房屋内修饰符 只有public internal
默认是internal
如果你写一个类给别人用 就用public
ctrl +J 提示咯·

// 属性 的本质是2个方法 get set
属性是对字段的封装!!
属性不存值 是存在封装的字段里面的·
属性的返回值与其封装的字段没关系
属性的返回值觉得了get返回值的类型和set参数的类型
只读属性 写一个get块
只写属性 写一个set 块
null表示没有指向让何对象
//
对象归纳成类
以类为模版实例一个对象·

//构造函数
访问修饰符 一般情况下是public 没有返回值 连void 都不用写
//
方法的名称与类名一致
//
构造函数在实例创建的时候调用(即new 关键字)
//
我们不可手动调用 坑爹啊··
//
构造函数可以有参数
可以构成重载
//
类中有隐式构造函数 如果写了其他的构造函数就不会自动生成隐式构造函数
因为怕自己写的无参构造函数 和自动生成的起冲突
//
构造函数的作用
//
在创建对象的同时需要执行一些代码 就丢如构造函数里面
初始化值
this 表示 代表当前对象 在那个对象里面就指的是那个对象
当前运行在内存中的那一个对象
//
普通方法可以在构造函数中被调用哦 但是请记住构造函数不能在普通方法中调用
//
构造函数可以互相调用
调用方法 public 类名(,):this(自己选哦)
//
this 关键字用处2 调用其他构造函数
//
主要执行的是那个构造函数就先调用那个构造函数 并且他是最后执行的因为我们实际上是想这个构造函数起作用
//
代码比较多的时候 重载构造函数的时候 如果需要用到相同的 就在另一个构造函数中 调用构造函数
//
//部分类
//
partial 部分类 声明关键字修饰
//
伙伴类必须在同一个命名空间下
类的名字要相同
分开管理 方便维护
//
对象在堆里 所以在堆里
//
引用类型才可以为null
值类型是 0
//
null表示没有指向堆空间中的任何一个对象
null 数据类型的值哦·
//
常量
用const 修饰的就是常量
常量一但声明就不能改变
声明的时候必须为其赋初值
//
不能改值的原因是 c#编译器在编译的的时候声明常量的那句话不见了
在使用常量的地方直接用常量的值代替了
常量可以提高运行效率 应为直接代替 不用去访问那一个变量了
//
//只读变量
//
只读变量只可以赋值 不可以更改
在构造函数中可以修改他的值
声明的时候可以指定初始值
但是在C#编译的时候 初始值没了
却变到了构造函数里面 为指定的值赋值
//
readonly 是运行时 确定值 编译时不能确定 又不能改 运行时确定 用readonly
const 编译时确定值 编译时能确定 用const
//
类下面不可以写执行代码 但是可以用静态的
//枚举
//
enum 关键字定义
枚举成员用逗号分隔
枚举的成员不需要用引号
给枚举类型赋值的时候 只能通过枚举点出来
枚举是一个值类型
每个枚举成员对应了一个整型的数值 从0 开始
//
通过强制转化获得枚举的值
//
可以手动为枚举成员赋值
//
假若不赋初始值 就显示0 对应的值
把一个字符串 转化成枚举值
//
必须有枚举项才可以
(枚举类型)Enum.Parse(typeof(枚举类型),转化的字符串) 返回的是object
(枚举类型)Enum.Parse(typeof(枚举类型),true) 是忽略大小写的转化
//
枚举转字符串 tostring();
d.ToString("d");
//
枚举默认是 int 类型的
枚举心后面加一个冒号:只能是整形的 可以指定类型 且必须在范围内
//
第三天//结构 是一个值类型
//
用struct 定义一个结构
结构级别和类保持一致 写在命名空间里面
//
结构和类一样 可以定义 字段 方法 属性 构造函数 也可以通过new 创建对象
//区别//
在类里面可以为成员字段赋初值 结构里面的字段不可以赋初始值
//
类里面有隐式构造函数 但写了一个构造函数 隐式构造函数就消失了
结构里面的隐式构造函数 无论怎么样都会自动生成 所以我们不可手动定义无参的构造函数
//
类里面的方法(构造函数)可以不为字段赋值 结构中必须为每一个字段赋值 (个人觉得类大写 随便浪费 结构轻量型不可以随便浪费)
//
类中为属性赋值 默认对字段赋值 而 在结构中 对属性赋值 不认为是对字段的赋值
因为 属性不一定是对字段的封装
//
结构中不能定义自动属性 因为自动属性在编译器里面会自动生成一个字段
然后构造函数里面又必须为该字段赋值 我又不知道这个字段是什么 所以怎么为这个字段赋值呢? 所以不可以
//
结构可以不通过new关键字声明 但是结构体对象的字段没有初始值 因为没有调用构造函数
构造函数必须为每一个字段赋值 所以通过new 关键字创建结构体对象就有默认值了
可以直接赋值
//
栈的访问速度快 但是空间小 堆的访问速度较慢 但是空间大
//描述一种数据类型 如果里面成员比较多 创建在堆里面比较好
//轻量级的数据类型 创建在栈里面比较好 可以提高速度
//
垃圾回收
//c#托管代码 clr管理 保护运行的叫 托管代码 可以自动回收垃圾
创建应与程序域 程序集在程序域里面运行 把每一.NET隔离起来 在一个.NET程序里面 无法访问另一个.net程序
被CLR管理 保护运行
//非托管代码 可以访问其他的内存
//
栈空间里面的变量 出作用域就被CLR自动回收 结束一个作用域的时候 作用域里面的 都被回收
//
堆里面的 当没有任何变量引用他的时候就被标记为垃圾对象 等待回收器 回收
GC每隔一段时间清理空间中的垃圾对象
GC清理垃圾对象的频率 程序员无法确定的 CLR自动控制
//
代回收机制
//
预先开辟一个空间 当这个空间满了之后 开始第一次回收里面的垃圾对象 (0代) 越老的 对象生命周期越长
然后 开辟另一个更加大的空间 把回收后剩余的 丢入其中 (1代) 把第0代空下来
如果此时创建一个对象会丢入第零代 如果第0代满了 继续自动回收 直到第一代满 才回收第一代
然后把剩余的丢入第二代 把0 1代 空出来 新数据永远丢在第0代
//如果全部满了 又没垃圾 就会内存溢出异常 ******有垃圾对象才回收
//GC.collect(); 立即让垃圾回收器对所有代进行回收
清理所有代//
GC.GetGeneration(p)对象所在的代数
GC.MaxGeneration()最大的代数
//静态函数
//
静态成员只能定义在类里面
静态变量
方法也可以被静态方法
被static修饰的是静态成员
//
静态成员是属于类的 访问时 类名.静态成员访问
实例成员是属于对象的 对象名.实例成员来访问
//
实例成员在成员被创建的时候创建 却不会创建静态成员
//
静态成创建 是在这个类第一次加载的时候创建的(即第一次访问的时候) 只创建一次 丢入静态存储区
静态成员在整个程序运行的时候只有一份
实例成员有多少个对象就有多少份
//
程序结束的时候回收静态成员
//
成员变量需要被共享的时候 就创建为静态类 如果有一个方法在程序中经常调用 就定义成静态方法
可以大大提高效率
//
静态方法被调用的时候 对象可能还不存在 this base 不可以在静态中使用 因为对象都没有 你还当前对象 SB么?
//
在实例成员中可以调用静态成员 因为这个时候静态成员一定存在
//
静态成员和实例成员的对比
//
生命周期不一样/
存储位子不一样/
//静态类
静态类中只能声明静态成员 因为静态类不能被new 所以实例成员是没意义的
构造函数是实例的 所以不能有实例的构造函数
静态类不可以被继承
静态类本质 是一个抽象的密封类哦
//
类里面所以的变量被共享 所以方法被仿佛调用 不希望这个类有子类 定义为静态类
//
不可以声明一个静态变量
//
//静态构造函数
静态构造函数 不能有访问修饰符 也没参数 所以没有重载
非静态类 也可以有静态构造函数
类里的成员第一次被访问值前 调用静态构造函数
构造函数也是成员 所以被new 的时候 也会访问成员 而创建静态构造函数哦 ·
//
在这个静态类被加载的时候 在静态存储区 为里面的成员赋值
首先到构造函数 然后执行静态构造函数 在执行构造函数
//
子类从父类继承所以非私有成员
//
创建子类对象的时候 会为子类对象的字段开辟空间 也会为父类的所以字段开辟空间 其中私有的只不过是访问不到
只不过父类的私有成员子类不能直接访问 但是可以父类中的方法访问
可以在子类中用base.关键字访问
//
子类的访问修级别 不可以比父类高
创建子类的时候会自动调子类的构造函数 然后调用父类的构造函数 然后执行了父类的构造函数 然后执行了子类的构造函数
//
子类的构造函数默认的后面加了一个:base()通过这个调用了父类的无参的构造函数
如果父类没有无参的构造函数 就会报错 因为子类会自动调用父类的无参构造函数
//
继承的单根性(一个类只能有一个父类)和传递性 ()
//
所以类都直接或间接从objec继承 /
//
几次是is a 的关系
//
不要为继承而继承
只要有一个功能不是子类所需要的 子类就不应该继承
//父类和子类存在同名成员的时候
//
先找子类 后找父类 如果子类找到了就 立马执行父类就不找了 否则 继续在父类找
//
public new void Test()隐藏父类同名成员
//

//第四天笔记
//
this可以调用同类的构造函数 base 还可以调用父类的构造函数
//
里氏替换原则(LSP) 子类可以替换父类的位子 并且程序的功能不受影响
//
父类有的功能 子类都有 所以不影响程序的功能
父类对象 指向子类对象

//变量类型是什么 类型指针就指向什么类型的 方法表
//当一个父类变量指向一个子类对象的时候 只能通过这个父类变量调用父类的成员 子类独有的无法调用
子类对象不能指向一个父类对象
必须有继承关系才能强制转化
//
如果一个父类变量执行的就是一个父类对象 将这个父类对象转化为子类对象会报错
//
如果一个父类变量指向了一个子类对象 就可以将这个父类变量 转化为子类对象
//
is 判断指定的变量 是否是指定的类型 is不能判断值类型
//
as 转化
如果转化成功··引用指向S4 如果转化失败·不报异常 返回null;
值类型不能用as 因为失败 了 是null而值类型 不可以为null
用 as必须是引用类型 而且 有继承关系
//
//虚方法 用virtual修饰 虚方法允许把父类的方法覆盖掉
一样调用父类的 只不过父类的被子类的修改了/
override点可以显示所以可以被干掉的方法 只显示虚的 ·
//
子类重写了父类的虚方法 那么通过父类变量调用子类对象 其共育的方法的时候 会调用子类的
//
父类变量 指向 子类对象
如果父类和子类存在同名成员 只能调到父类的 这个不是虚方法
//
如果重写 了 就调用 子类的 但是父类的依旧存在
//
多态
//
多态的表现形式之一 将父类类型作为方法参数
多态的表现形式之二 将父类类型作为方法的返回值
//
继承是为了多态 扩展 开闭原则
//
tostring()方法
//
类的全名称
//
所有的结构继承于value Type类>object
sealed 密封类 修饰的类 不可以被继承
//
不能被重写 就用sealed 修饰他
//
如果要强制被子类继承必须重写 就定义为抽像
抽象方法没有方法体
因为他必须要被子类重写 也就是说不可能调用父类的方法 他就没必要去写方法体了
abstract
抽象方法必须在抽象类中·
抽象方法不可以被实例化 因为 抽象方法没有方法体 实例化没意义
从抽象类继承的子类 必须重写父类的所有抽象方法
重写的语法 和viral一样
//
抽象方法是光说不做只是定义了一个具有这样行为 具体的实现交给子类
//
抽象类中可以拥有非抽象成员 为了继承给他的子类
//
抽象类里面 可以有虚方法
//
没有必要去new 一个父类的时候
父类一些东西必须被子类继承,被子类重写
我们就用抽象类
//
被继承 为了多态
//
抽象成员不能是私有的
//第五天
tostring 和Equals
//
假设Person p=new Person();
cw"p";
实际打印的是
p.tostring();
this.gettype.tostring();
如果不想打印类的全名称 我们可以选择重写tostring();
//
在object 里面的equals比较的是2个对象的地址 乳沟引用地址是一样的就返回true
//
如果比较的是2个string 那么就是比较里面的内容是否一样
//
如果比较的是2个int 那么就是比较里面的值是否相等
//
Equals 默认比较的是 2个对象的地址
string 值类型 比较的是字段里面的值是否相等 不存在重写 只是值类型新增了一个方法
//
引用类型除了string 类型比较的是地址 值类型的比较的是值
//

//接口 是一个特殊的抽象类
使用interface 来定义一个接口
接口表示具备某种能力
//
接口不能被new 实例化
//
接口中的成员默认就是抽象的·
接口中只能定义属性方法索引器 事件
/抽象成员不能有访问修饰符 默认是public 连void 都没有
//
实现借口的类必须 实现接口中所有的成员 因为接口的本质是一个抽象类
//
实现接口的 是实现重写的
实现类在实现接口成员的时候不用重写override 关键字
//
实现类成员的时候必须保持签名一致 不一致构成重载 不是重写
//
接口就是一个纯粹为了规范实现类
//
接口中的属性不是一个自动属性 因为没有自动实现字段
只是一个get() set()方法 等待实现接口的类去实现这个字段
//
可以找到父类并且希望给子类继承一些成员 就可以用抽象类
多个类具有相同的方法 但又找不到父类 就可以用接口类
//
要继承一个类 要要实现一个接口把类写在前面 用的逗号分隔 后面接接口名
//
父类可以继承一个 接口可以实现多个
//
在一定程度上解决了单根性的问题
//
接口可以继承接口 并且可以多继承
//
接口里面的方法是可以被修饰成为 抽象方法 和虚方法的 等待子类的重写
//
显示的接口是为了解决方法名冲突的问题 并且是私有的 因此不能通过对象的变量来调用
//
显示实现接口 只能通过接口来调用
//

//装箱和拆箱
//装箱就是把值类型转化为引用类型
//把引用类型 变成值类型 就是拆箱·强制丢到栈里面

2个字符串相加 调用string.Concat();方法

"""第六天咯//
//
字符串是一个特殊的引用类型
字符串我们可以看作一个字符数组
//
字符串一旦创建这个 对象就不会被修改了
//
因为有一个叫字符串拘留池 很牛的·!
//
你创建一个字符串 假设是 123 首先指向他 然后就创建一个 456
就又指向 456 假设又创建 一个 123 重新指向就够了
如何证明呢? 你会发现 2个 123的 地址一样的哦·!
//
创建一个字符串的时候 先去拘留池找 没有就创建
//
字符串一旦被创建 不会被GC回收
//

//字符串常用的用法
//
构造函数只能传递字符数组
//
string.Empty 代表一个空的字符串 (不是null谢谢)
//
compare(a,b) 相等返回0 a>b返回1 小于 -1
concat(,) 连接多个字符串
contains 判断指定的串里面是否包含指定的子串 返回一个bool
EndsWith() 判断指定的字符串是否以指定的子串结尾
StartsWith() 判断指定字符串的开始 是否包含
Format(string,object) 格式化字符串
indexOf()返回 从0开始 找到子串 第一次出现的索引 没有返回-1
LastIndexOf()重结尾往前面查 第一次子串出现的索引
insert() 插入字符串
isnullorEmpty() 是不是null值 或者是string.empty
remove(1) 指定索要后面的 删除
replace() 替换
split() 以指定字符分隔字符串 返回数组
substring() 切割 传一个 就把开始前面的切掉 传2个参数 是 保留开始 到最后
tochararray 将字符串转化为字符数组
tolower() 小写
toupper() 大写
去掉前后空格 trim()
str 只能拿值 不能赋值
测试时间stopwatch
satch.start()
watch.stop()
watch.el
//

stringBuider 对象是可以变的 他存在堆里面 高效的字符串拼接类
拼接字符串的工具 大多数都需要tostring();
//我的数组
arraylist 自动数组
list.Add() 新增数组
Capacity 表示object 的长度
remove();删除第一个
list.Clear()清空动态数组
清空之后数组的长度不会改变
clone 克隆一个 不是同一个
forerch
背后
IEnumerator tor=ji.GetEnumerator();
while(tor.MoveNext())
{
cw "tor.Current"
}
//
MoveNext()方法指针开始在-1 并且返回在该处有没值 有则true 无这flase
//
实现foreach 的步骤
1. 实现IEnumerable
2.背后
IEnumerator tor=ji.GetEnumerator();
while(tor.MoveNext())
{
cw "tor.Current"
}
GetEnumerator();要实现IEnumerator接口对象
于是我们写了一个实现了IEnumerator的类 方法中返回这个实例
//
arrarlist的缺点 下标不可靠
hashtable
//
第七天//
file.readalltext("路径") 把指定路径的字符读出来
hashtable hash_coll 键的哈希码赋值给 hash_coll
然后 根据哈希码%数组的长度 来存储数据//
//
泛型集合· <T> 类名加<T> List<> qu
//
Dictionary<,>
//
KeyValuePair<string,Person> pair in dic
//
1.错误
//不符合语法规范
2.异常 一旦发生 程序就会立即停止
//运行中发生的
try代码里面如果发生异常 就立即跳到catch里面去
//
窗体应用程序start
thread 线程 =new thread();
thread.isbackgroudn=true;
thread.Start();
controls.add();
//
先把private Button btn;
在构造函数里面
btn=new ();
btn.text();
this.controls.add();
在全局声明一个 自己想要的类型控件字段
在入口方法下面 this.controls.add()加入这个控件就o啦
控件命名 前面3个字
事件就是加= 然后按tab 自动生成方法
load 构造函数执行完毕之后 窗体显示之前
构造函数 load 窗体显示
//
timer 类 计时器
interval 时间间隔 单位毫秒 每间隔 这么多秒 做什么事情
tick+=+tab 自动生成方法
start开始计算器
//
uri u=new Uri(url)
创建链接
BingdingSource bs=new
bs.dataSorce=list;
data
获得选中行 selectRows[0].Cells[0].Value.ToString(); 选中行 第一列内容

选中行的列内容
//
单例模式
/私有化构造函数
//提供一个私有的静态的 类的字段名 private static T P;
//提供一个公共的静态方法 返回上面 字段名创建的对象
public static T GetSingle()
{
if(p==null) 窗口if(p==null||isdisposed)
{
p=new T();
}
return p;
}
ADD.MDiparent 只能在容器里面 运动啊
//第八天?
//
path 类/// 静态类 对字符串的修改
Path.DirectorySeparatorChar→\
Path.PathSeparator→;
Path.VolumeSeparatorChar→:

//
ChangeExtension 修改字符串的扩展名
Combine() 把2个字符串合成一个路径 如果用+可能忘记用斜线 自动加
GetDirectoryName(); 获得目录名称 就是该文件的上一级
GetExtension() 获得后缀名 .+ 如果木有 则返回空串
GetFileName() 获得文件名字
GetFileWithoutExtension 得到文件名没后缀名
GetFullPath() 获得路径全名称咯 根据相对路径 获得绝对路径 哇哈哈
GetTempFileName(); 获得临时文件名 并且创建了 这个文件 (得到一个随即的系统文件名 这个文件已经创建好了)
GetTempPath 获得临时文件存储路径
//
绝对路径 物理全路径 相对路径 对这个目录
//
file 类/// 对文件的操作
File.ReadAllLines(“path”, Encoding.Default);//读取所有行,返回string[]
File.ReadAllText(“path”, Encoding.Default);//读取所有文本返回string
File.ReadAllBytes(“path”);//读取文件,返回byte[]
===================================
File.WriteAllLines(“path”, new string[4] ,Encoding.Default);//将string数组按行写入文件。
File.WriteAllText(“path”, “string”);//将字符串全部写入文件
File.WriteAllBytes(“path”,new byte[5]);//将byte[]全部写入到文件
File.AppendAllText()//将string追加到文件
//
Create(); 创建指定文件 如果文件已经存在则覆盖
AppendAllLines(); 向已有的文本文件中追加字符 哦
AppendText();
Copy();
Delete();删除 丢的 都是路径
Exists() 判断指定路径的文件是否存在
GetAccessControl()获得指定路径的文件权限
Move 移动文件
ReadAllText();
ReadAllLines()返回字符串数组 每一行
//
编码问题
//
ASCII
GB2312 每2个字节 表示一个汉字 1个字节8位哦
GB10
BIG5
Unicode 编码 4个字节
UTF-8 用1-4个字节表示
//
Directory 类//
//
void Delete(string path, bool recursive) 删除目录, recursive表示是否递归删除,如果recursive为false则只能删除空目录
bool Exists(string path) 判断目录是否存在
move()
CreateDirectory()
GetDirectories(string path) 得到一个目录下的子目录
GetDirectories(string path, string searchPattern, SearchOption searchOption) 通配符查找目录下的子目录,可以搜索到隐藏文件。
GetFiles(string path)
GetFiles(string path, string searchPattern, SearchOption searchOption) 通配符查找目录下的文件
DirectoryInfo GetParent(string path) 得到目录的父目录
//
File类的常用静态方法:(FileInfo*)
void AppendAllText(string path, string contents),将文本contents附加到文件path中(如果文件不存在,则创建)
bool Exists(string path)判断文件path是否存在
string[] ReadAllLines(string path) 读取文本文件到字符串数组中
string ReadAllText(string path) 读取文本文件到字符串中
void WriteAllText(string path, string contents)将文本contents保存到文件path中,会覆盖旧内容。
WriteAllLines(string path,string[] contents),将字符串数组逐行保存到文件path中,会覆盖旧内容。
//
获取当前exe文件执行的路径:
Assembly.GetExecutingAssembly().Location;
//
File.Open(); //返回FileStream
File.OpenRead();//返回只读的FileStream
File.OpenWrite();//返回只写的FileStream
//
fileInfo
//
第九天
//
递归就是在方法中调用方法
//
创建文件流对象 并且指定路径 在指定操作的
准备一个 byte数组
FileStream = new FileStream();
将字符数组以指定的编码变成字符串
Encoding.Default.GetString();
第十天
//
using 管理对象 一出using 块 就会被自动释放
(p as IDisposable).DIspose()
using的本质是 try finally 把using 生成在了try块中 最后调用了dispose中
//
序列化与反序列化
System.Runtime.Serialization.Format.Binary.BinaryFormatter
[Serializeble]
类上面写哦
标记可序列化
//线程
//在这个命名空间下面
using System.Threading;
//线程默认情况下是前台线程
//要所有的全台线程退出以后 程序才会退出
//进程里面默认的线程 我们叫主线程 或者 ui线程
//后台线程 只要所有的前台线程结束 所有的后台线程就会立即结束
//多个线程访问同哥资源 可能造成不同步 就叫线程重入
lock(this)锁起来 限制在一时间只有一个线程执行
//一个进程有多个线程
Abort(); 退出线程
Thread.sleep(毫秒单位); 暂定
Thread.CreentThread
object sender事件源 EventArgs
(object obj)
//
11天 GDI 绘图
Drowing 中
graphics 画家
//
//
//
//

 

转载于:https://www.cnblogs.com/bluesli/p/4632812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值