1. 堆结构和栈结构(值类型和引用类型)
在C#程序中每一个方法都是一个栈空间,用于存放方法中的数据。
在栈中的数据应该确定长度,不应该变化。变化的数据放到堆中
VS2010调试菜单--窗口--调用堆栈
查看值类型的栈地址 调试菜单--窗口--内存 &num
在vs2010中无法得到引用类型的栈地址
查看引用类型的堆地址 *array
栈结构中的变量--值类型(长度确定,有范围)
sbyte byte short ushort int uint long ulong float double decimal
char -- 两个字节 一个Unicode字符,存储0~65535之间的整数
bool enum struct
引用类型--string class interface int[] string[] (类,接口,数组)
2. 值传递
1)值类型的值传递
2)引用类型的值传递
两个方法中的变量是不同的变量,但是里面存储的数据相同
值类型就是存储值本身
引用类型那个就是存储引用类型在堆空间中的地址
字符串的不可变性
当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值
3. 引用传递
1)值类型的引用传递
在定义方法的时候,在参数类型前加上ref
在调用方法的时候,在参数前加上ref
2)引用类型的引用传递
多个返回值的情况,加out参数可以在方法内修改的值在方法外使用
4. 常用类库--字符串
字符串的常用方法
-> 增
-> 构造方法: new string(new char[] {...})
new string(char c, int count)
-> 加号:+
-> 连接字符串的方法:
string.Join(连接分隔符, 字符串数组或集合);
//Demo 给label的text赋值,将list中的每条记录换行后输出
lbLetterStatistics.Text = string.Join("\r\n", list);
-> 插入的方法:
<字符串实例>.Insert(索引, 数据)
-> 删
-> Remove
<字符串实例>.Remove(索引, 总数) "0123".Remove(1,1) --023
-> Substring
<字符串实例>.Substring(索引, 总数) "0123".Substring(1,1) --1
-> Replace
<字符串实例>.Replace(需要删除的字符, "")
//demo 直接去除所有空格
s=s.Replace(" ","");
Console.WriteLine(s);
-> Trim(TrimEnd,TrimStart)
-> 改
-> Replace
-> Split
<字符串实例>.Split(char[], StringSplitOptions.RemoveEmptyEntries)
"赵晓虎,赵剑宇,牛亮亮".Split(new char[] {','})
"I have a dream".Split(' ');
// I, 空, have, a, dream
-> PadLeft
<实例字符串>.PadLeft(总长度, 填充字符)
订单号:123
"123".PadLeft(10, '0')
-> 变大小写
ToLower()
ToUpper()
-> 查
-> IndexOf(LastIndexOf,IndexOfAny,LastIndexOfAny)
<字符串实例>.IndexOf(要找的字符或字符串, 从第一个索引开始)
找到一个字符串中所有字符'e'的位置
获得文件的后缀名的案例
Path.GetExtension(文件路径)
int index = 文件路径.LastIndexOf('.');
string ext = 文件路径.Substring(index);
"abdcdef".IndexOfAny(new char[] {'d', 'e'})
-> Contains
return <字符串>.IndexOf("要包含的字符") != -1;
-> StartsWith
-> EndsWith
将两个路径合并 -- 判断结尾是否有\,如果没有要加
p1 = @"C:\123\456";
p2 = @"789.mp3";
-> 其他
-> 比较
==
Equals
s1.Equals(s2)
string.Equals(s1, s2)
string.Compare(string s1, string s2)
s1 > s2 1
s1 = s2 0
s1 < s2 -1
-> 格式化
string.Format()
-> Length
-> string.IsNullOrEmpty(字符串)
-> ToCharArray()
使用案例1:字符串str--Csharp基础10101,如何截取到数字部分?
string strNum = str.Substring(str.TrimEnd("0123456789".ToCharArray()).Length);
params double[] array 做为方法的参数
使用案例2:
123-456---7---89-----123----2把类似的字符串中重复符号”-”去掉,既得到123-456-7-89-123-2
string str = "123-456---7---89-----123----2";
string[] strs = str.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(string.Join("-", strs));
获得数组的方法
int[] nums = {1,2,3,4,5};
char[] chs = "12345".ToCharArray();
string[] strs = "1,2,3,4,5".split(',');
5. StringBulider仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String
Append() AppendLine() Clear() ToString()
6. 垃圾回收是非常重要的一个问题
比如你创建了一个网站,放在服务器上。那么这个网站一直运行,也会创建对象,释放对象等等,会产生垃圾
垃圾回收的目的:提高内存利用率。
压缩回收算法--会让程序暂停,执行对象的移动,
内存会随机的清零或在下一次创建对象的时候将原来的内存部分回收,实际上垃圾回收是对性能有损失的
垃圾回收器,只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。
没有变量引用的对象,表示可以被回收了(null)
GC.Collect();//手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC。
垃圾回收器中“代”的概念:
共3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次第1代,再次第2代。
每次创建的对象默认处于0代
每一个代的存储空间是有限的
当创建的对象第0代满的时候,进行回收
将没有回收的数据计入第1代
再创建对象依旧是第0代
... ...
第一代满的时候进行回收,留下的进入第二代
... ...
第二代满的时候(异常)
在C#程序中每一个方法都是一个栈空间,用于存放方法中的数据。
在栈中的数据应该确定长度,不应该变化。变化的数据放到堆中
VS2010调试菜单--窗口--调用堆栈
查看值类型的栈地址 调试菜单--窗口--内存 &num
在vs2010中无法得到引用类型的栈地址
查看引用类型的堆地址 *array
栈结构中的变量--值类型(长度确定,有范围)
sbyte byte short ushort int uint long ulong float double decimal
char -- 两个字节 一个Unicode字符,存储0~65535之间的整数
bool enum struct
引用类型--string class interface int[] string[] (类,接口,数组)
2. 值传递
1)值类型的值传递
2)引用类型的值传递
两个方法中的变量是不同的变量,但是里面存储的数据相同
值类型就是存储值本身
引用类型那个就是存储引用类型在堆空间中的地址
字符串的不可变性
当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值
3. 引用传递
1)值类型的引用传递
在定义方法的时候,在参数类型前加上ref
在调用方法的时候,在参数前加上ref
2)引用类型的引用传递
多个返回值的情况,加out参数可以在方法内修改的值在方法外使用
4. 常用类库--字符串
字符串的常用方法
-> 增
-> 构造方法: new string(new char[] {...})
new string(char c, int count)
-> 加号:+
-> 连接字符串的方法:
string.Join(连接分隔符, 字符串数组或集合);
//Demo 给label的text赋值,将list中的每条记录换行后输出
lbLetterStatistics.Text = string.Join("\r\n", list);
-> 插入的方法:
<字符串实例>.Insert(索引, 数据)
-> 删
-> Remove
<字符串实例>.Remove(索引, 总数) "0123".Remove(1,1) --023
-> Substring
<字符串实例>.Substring(索引, 总数) "0123".Substring(1,1) --1
-> Replace
<字符串实例>.Replace(需要删除的字符, "")
//demo 直接去除所有空格
s=s.Replace(" ","");
Console.WriteLine(s);
-> Trim(TrimEnd,TrimStart)
-> 改
-> Replace
-> Split
<字符串实例>.Split(char[], StringSplitOptions.RemoveEmptyEntries)
"赵晓虎,赵剑宇,牛亮亮".Split(new char[] {','})
"I have a dream".Split(' ');
// I, 空, have, a, dream
-> PadLeft
<实例字符串>.PadLeft(总长度, 填充字符)
订单号:123
"123".PadLeft(10, '0')
-> 变大小写
ToLower()
ToUpper()
-> 查
-> IndexOf(LastIndexOf,IndexOfAny,LastIndexOfAny)
<字符串实例>.IndexOf(要找的字符或字符串, 从第一个索引开始)
找到一个字符串中所有字符'e'的位置
获得文件的后缀名的案例
Path.GetExtension(文件路径)
int index = 文件路径.LastIndexOf('.');
string ext = 文件路径.Substring(index);
"abdcdef".IndexOfAny(new char[] {'d', 'e'})
-> Contains
return <字符串>.IndexOf("要包含的字符") != -1;
-> StartsWith
-> EndsWith
将两个路径合并 -- 判断结尾是否有\,如果没有要加
p1 = @"C:\123\456";
p2 = @"789.mp3";
-> 其他
-> 比较
==
Equals
s1.Equals(s2)
string.Equals(s1, s2)
string.Compare(string s1, string s2)
s1 > s2 1
s1 = s2 0
s1 < s2 -1
-> 格式化
string.Format()
-> Length
-> string.IsNullOrEmpty(字符串)
-> ToCharArray()
使用案例1:字符串str--Csharp基础10101,如何截取到数字部分?
string strNum = str.Substring(str.TrimEnd("0123456789".ToCharArray()).Length);
params double[] array 做为方法的参数
使用案例2:
123-456---7---89-----123----2把类似的字符串中重复符号”-”去掉,既得到123-456-7-89-123-2
string str = "123-456---7---89-----123----2";
string[] strs = str.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(string.Join("-", strs));
获得数组的方法
int[] nums = {1,2,3,4,5};
char[] chs = "12345".ToCharArray();
string[] strs = "1,2,3,4,5".split(',');
5. StringBulider仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String
Append() AppendLine() Clear() ToString()
6. 垃圾回收是非常重要的一个问题
比如你创建了一个网站,放在服务器上。那么这个网站一直运行,也会创建对象,释放对象等等,会产生垃圾
垃圾回收的目的:提高内存利用率。
压缩回收算法--会让程序暂停,执行对象的移动,
内存会随机的清零或在下一次创建对象的时候将原来的内存部分回收,实际上垃圾回收是对性能有损失的
垃圾回收器,只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。
没有变量引用的对象,表示可以被回收了(null)
GC.Collect();//手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC。
垃圾回收器中“代”的概念:
共3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次第1代,再次第2代。
每次创建的对象默认处于0代
每一个代的存储空间是有限的
当创建的对象第0代满的时候,进行回收
将没有回收的数据计入第1代
再创建对象依旧是第0代
... ...
第一代满的时候进行回收,留下的进入第二代
... ...
第二代满的时候(异常)