一、数据类型

1、数据类型
1>类型分类
- 通用类型系统CTS(Common Type System)是 .NET 框架中的一个组成部分,为所有面向 .NET 框架的语言定义了数据类型的规则;
- 值类型:存储数据本身
- 引用类型:存储数据的引用(内存地址)
2>类型归属

2、内存分配
1>内存
- 是CPU与其他外部存储器交换数据的桥梁;
- 用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理;
- 通常开发人员表达的"内存"都是指内存条。
2>分配
- 程序运行时,CLR将申请的内存空间从逻辑上进行划分;
- 栈区:
–空间小(1MB),读取速度快 –用于存储正在执行的方法,分配的空间兼做栈帧。栈帧中存储方法的参数以及变量等数据。方法执行完毕后,对应的栈帧将被清除。 - 堆区:
–空间大,读取速度慢 –用于存储引用类型的数据。
3、局部变量
- 定义在方法内部的变量
- 特点:
–没有默认值,必须自行设定初始值,否则不能使用 –方法被调用时,存在栈中,方法调用结束时从栈中清除
1>值类型与引用类型
-
值类型: 声明在栈中,数据存储在栈中 -
引用类型: 声明在栈中,数据存储在堆中,栈中存储该数据的引用 -
理解: 1、因为方法执行在栈中,所以在方法中声明的变量都在栈中 2、因为值类型直接存储数据,所以数据存储在栈中 3、又因为引用类型存储数据的引用,所以数据在堆中,栈中存储数据的内存地址
2>垃圾回收器
- GC(Garbage Collection)是CLR中一种针对托管堆自动回收释放内存的服务;
- GC线程从栈中的引用开始跟踪,从而判定哪些内存是正在使用的,若GC无法跟踪到某一块堆内存,那么认为这块内存不再使用,即为可回收的。
4、成员变量
- 定义在类中方法外的变量
- 特点:
–具有默认值 –所在类被实例化后,存在堆中,对象被回收时,成员变量从堆中清除 –可以与局部变量重名
1>值类型与引用类型
- 值类型:
声明在堆中,数据存储在堆中 - 引用类型:
声明在堆中,数据存储在堆的另一块空间
5、应用
1>比较
static void Main()
{
int num01 = 1, num02 = 1;
bool r1 = num01 == num02;
int[] arr01 = new int[] { 1 }, arr02 = new int[] { 1 };
bool r2 = arr01 == arr02;
bool r3 = arr01[0]== arr02[0];
}
2>赋值
static void Main()
{
int a = 1;
int b = a;
a = 2;
Console.WriteLine(b);
int[] arr = new int[] { 1 };
int[] arr2 = arr;
arr = new int[]{2};
Console.WriteLine(arr2[0]);
string s1 = "男";
string s2 = s1;
s1 = "女";
Console.WriteLine(s2);
object o1 = 1;
object o2 = o1;
o1 = 2;
Console.WriteLine(o2);
}

  
3>传参
static void Main()
{
int a = 1;
int[] arr = new int[] { 1 };
Fun1(a,arr);
Console.WriteLine(a);
Console.WriteLine(arr[0]);
}
private static void Fun1(int a,int[] arr)
{
a = 2;
arr = new int[] { 2 };
}
  
6、拆装箱
1>装箱 box
- 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程;
- 内部机制:
1.在堆中开辟内存地址 2.将值类型的数据复制到堆中 3.返回堆中新分配对象的地址
2>拆箱 unbox
- 从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换;
- 内部机制:
1.判断给定类型是否是装箱时的类型 2.返回已装箱实例中属于原值类型字段的地址

static void Main()
{
int a = 1;
object o = a;
int b = (int)o;
int num = 100;
string str01 = num.ToString();
string str02 = "" + num;
}
7、string
1>特性
- 字符串常量具备字符串池特性
1.字符串常量在创建前,首先在字符串池中查找是否存在相同文本。如果存在,则直接返回该对象引用;如果不存在,则开辟空间存储。 2.作用:提高内存利用率 - 字符串具有不可变性
字符串常量一旦具有内存,就不得再次改变。因为如果在原位置改变会使其他对象内存被破坏,导致内存泄漏 。当遇到字符串变量引用新值时,会在内存中新建一个字符串,将该字符串地址交由该变量引用。
static void Main()
{
string s1 = "八戒";
string s2 = "八戒";
string s3 = new string(new char[] { '八', '戒' });
string s4 = new string(new char[] { '八', '戒' });
bool r1 = object.ReferenceEquals(s3, s4);
s1 = "悟空";
Console.WriteLine(s1);
object o1 = 1;
o1 = 2.0;
o1 = "ok";
o1 = true;
string strNumber = "";
for (int i = 0; i < 10; i++)
{
strNumber = strNumber + i.ToString();
}
StringBuilder builder = new StringBuilder(10);
for (int i = 0; i < 10; i++)
{
builder.Append(i);
}
builder.Append("是哒");
string result = builder.ToString();
builder.Insert(0,"builder");
s1 = s1.Insert(0, "s1");
}

2>常用方法
- ToCharArray(将字符串转为字符数组)
??????
~~~~~~
?????? Insert(在指定索引位置插入字符串)
Contains(检查字符串中是否包含某个字符)
????
~~~~
???? ToLower(将字符串全部转为小写字母) ToUpper(将字符串全部转为大写字母)
?????
~~~~~
????? IndexOf(返回某个字符的索引) Substring(从指定索引开始复制一个子字符串)
???
~~~
??? Trim(移除字符串两侧的空白字符或其他预定义字符) Split(以某些字符为分隔符将字符串分割成字符串数组)
??????
~~~~~~
?????? Replace(替换字符串中的某个字符) Join(将字符串数组中的字符串进行拼接,中间以某个字符分隔开)
static void Main()
{
string s1 = " sda Hisc as ";
char[] s2 = s1.ToCharArray(0, 5);
foreach (var item in s2)
{
Console.WriteLine(item);
}
string s3 = s1.Insert(0, "abs");
bool r1 = s1.Contains('d');
string s4 = s1.ToLower();
string s5 = s1.ToUpper();
int index = s1.IndexOf('i');
string s6 = s1.Substring(5);
string s7 = s1.Trim();
string[] s8 = s1.Split(new char[] { 'a' });
string s9 = s1.Replace('a', 'b');
string s10 = string.Join(' ', new string[] { "dsa", "ewq", "sxc" });
}
C#字符串的处理 String和StringBuilder: 传送门.
|