前几个月图一时爽快辞了职,自认为做了2年.net开发,对C#可算是轻车熟路,然而出去面试却坑的要死~被别人问的一脸懵逼。突然意识到自己这俩年就是一个代码搬运工,只知道日复一日的写代码,却从来没问过为什么这样写?为什么这样写就能实现这样的问题。之后准备开一个系列,总结下平时遇到的一些C#知识,算作记录吧,希望坚持下去!
今天写写我遇到的第一个问题吧:C#的中方法参数的传递方式。
简单里讲,其实有俩种,一种是值传递,一种是引用传递
public void Demo(int a, DateTime date)
{
Console.WriteLine("值传递");
}
public void Demo(ref string a,out string b,StudentInfo obj)
{
b = "Hello World";
Console.WriteLine("引用传递");
}
先说下我值和引用,看了下网上大佬的研究,值类型都是来自于System.ValueType派生类,而System.ValueType又是直接继承自System.Object,枚举类型来自System.Enum,System.Enum又是来派生于System.ValueType。而且值类型都是隐式密封的(sealed)。值类型包括了系统定义的类型,用户自定义的和枚举。这里说下,DateTime是个结构体,不是类,所以它是值类型。
值类型也叫轻量级类型,大多数情况下,都是分配在线程栈上面的,不受GC影响。引用类型,基本上类,接口,都是引用,引用类型分配在托管堆上面,会产生GC。
至于传递方式,值类型是对值的拷贝,等于再拷贝一份到线程堆上面,而引用类型只是传递一个地址。
我们判断一个类型是值类型还是引用类型,可以根据传递来看出,比如传递datetime类型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
DateTime date1 = DateTime.Now;
DateTime date2 = date1;
Console.WriteLine(date1);
Console.WriteLine(date2);
date1 = date1.AddHours(12);
Console.WriteLine(date1);
Console.WriteLine(date2);
Console.ReadLine();
}
}
}
运行后结果:
这里看出,我改变了date1的值后,date2并未改变。这就是值类型。
先写到这里吧~这个系列随缘写~还能说很多,堆和栈,GC,ref和out等等。
留个记录吧。后面会写写.net MVC。之前公司一直用webfrom,换了工作换了MVC模式。也算一个新的开始吧。