stack vs heap
Stack(
- 一块内存)存储本地变量(函数内的变量)和参数
- 随着函数的进入和退出,stack也会随之增大和缩小
Heap
- Heap(一块内存)。对象所在的地方(引用类型的实例)
- 当新的对象被创建后,他会被分配在Heap上, 到该对象的一个引用被返回
- 程序执行时,随着新对象额不断建立, heap会被慢慢填满,运行时的gc会周期性的把对象从heap上面释放出来,所以不会导致内存耗尽
- 一旦一个对象不再被任何‘存活’的东西引用,那么他就可以被释放了
内存
- 值类型的实例(和对象的引用)会放在变量声明时所在的内存块里
- 如果该实例是一个class的字段或数组的元素,那么它就在Heap上
GC
- c#里不可以显式的删除对象
- 无引用的对象会逐渐的被GC收集
static
- 在Heap上
- 它们会存活到应用程序停止为止
Parameters & Arguments
image.pngarguments 为值传递
static void Main()
{
int x = 8;
Foo(x); //Make a copy of x
Console.WriteLine(x);// x will still be 8
}
static void Foo(int p)
{
p = p+1;
Console.WriteLine(p); // 9
}
按值传递引用类型的arguments
- 复制的是引用,不是对象
static void Main()
{
StringBuilder sb = new StringBuilder();
Foo(sb);
Console.WriteLine(sb.ToString());//test
}
static void Foo(StringBuilder fooSB)
{
fooSB.Append("test");
fooSB = null;
}
- 想要按引用传递,可以使用ref参数修饰符
static void Main()
{
int x = 8;
Foo(ref x); //Make a copy of x
Console.WriteLine(x);// 9
}
static void Foo(int p)
{
p = p+1;
Console.WriteLine(p); // 9
}
- 按引用传递 out
和ref差不多,除了: - 进入函数钱不需要被赋值
- 离开函数前必须被赋值
static void Split(string name, out string firstName, out string lastName)
{
int i = name.LastIndexof(' ');
firstNames = name.Substring(0,i);
lastNames = name.Substring(i+1);
}
static void main(){
{
Split("Stevie Ray Vaughan", out string a, out string b);
Console.WriteLine(a);// Stevie Ray
Console.WriteLine(b);// Vaughan
}
按引用类型进行传递的含义
当你按引用传递arguments的时候,相当于给现有变量的存储位置起了个别名,而不是创建了一个新的存储位置
params 修饰符
- 可以在方法的最后一个参数使用params参数修饰符
- 可以接受任意数量的该类型的参数
- parameters类型必须是参数
- 也可以使用数组作为arguments
static int Sum(params int[] ints)
{
int sum = 0;
for (int i =0; i< ints.Length; i++)
{
sum += ints[i];
}
return sum;
}
static void Main()
{
int total = Sum(1,2,3,4);
// int total = Sum(new int[] {1,2,3,4});
Console.WriteLine(total);//10
}
ref locals
- C# 7, 可以定义一个本地变量,它引用了数组的一个元素或对象的一个字段
- int[] numbers = {0,1,2,3,4};
- ref int numRef = ref numbers[2];
- numRef 就是对numbers[2]的引用,修改numRef的时候就是修改numbers[2]这个元素
- Ref local的目标必须是数组的元素,字段,本地变量 不可以是属性
- 常用于微优化场景,通常与ref returns联合使用
int [] nubmers = {0, 1, 2, 3, 4 }
ref int numRef = ref numbers[2];
numRef * = 10;
Console.WriteLine(numRef); //20
Console.WriteLine(numbers[2]); //20
网友评论