和同事喋喋不休,吵個不停,於是查閱文檔,復習相關的值類型和引用類型、值傳遞和引用傳遞,總結分享!如有錯誤還望指正!一個人思想有限,集思廣益,共同發展。
值類型和引用類型
首先分清C#中的值類型和引用類型的區分:
①值類型包括:int、char、double、float、long、short、byte、bool、enum、struct、decimal。
值類型都是派生自ValueType ValueType 是抽象類
值類型不能繼承,只能實現接口。
②string、數組、類(自定義數據類型)、接口、委托、
int[] n={1,2,3};//引用類型。
引用類型都派生自:Object
引用類型可以繼承(類之間可以繼承)
需要知道和明白的規律
1、記住聲明變量都在棧上
2、值類型聲明變量之後,不管值是多大多小,變量大小固定,存在棧上
3、引用類型聲明變量之後,取決於值的多少!大小不固定,存放在棧和堆上
值傳遞案例如下:
class Program
{
static void Main(string[] args)
{
//1.值類型=====
//int n = 10;
//int m = n;
//m++;
//Console.WriteLine(n);
//Console.ReadKey();
//2.引用類型========
//Person p = new Person();
//p.Age = 17;
//p.Name = "johnson";
//p.Email = "johnsondzd@qq.com";
//Person p1 = p;
//p1.Age = p.Age + 12;
//Console.WriteLine(p.Age);
//Console.ReadKey();
//案例1
//int m = 1;
//M1(m);//值類型作為參數傳遞的時候是【拷貝了一個副本】,所以改變副本不影響原來的內容
//Console.WriteLine(m);
//Console.ReadKey();
//案例2
//int[] arrInt = { 1, 3, 5, 7, 9, };
//M2(arrInt);
//for (int i = 0; i < arrInt.Length; i++)
//{
// Console.WriteLine(arrInt[i]);
//}
//Console.ReadKey();
//案例3
//int[] arrInt = { 1, 3, 5, 7, 9, };
//M3(arrInt);
//for (int i = 0; i < arrInt.Length; i++)
//{
// Console.WriteLine(arrInt[i]);
//}
//Console.ReadKey();
//案例4
//Person p = new Person();
//p.Name = "johnson";
//p.Age = 16;
//M4(p);
//Console.WriteLine(p.Name);
//Console.WriteLine(p.Age);
//Console.ReadKey();
//案例5
Person p = new Person();
p.Name = "johnson";
p.Age = 16;
M5(p);
Console.WriteLine(p.Name);
Console.WriteLine(p.Age);
Console.ReadKey();
}
static void M5(Person per)
{
per = new Person();
per.Name = "vinson";
per.Age = 32;
}
static void M4(Person per)
{
per.Name = "vinson";
per.Age = 32;
}
static void M3(int[] arr)
{
int[] arr1 = { 2, 4, 6 };
arr = arr1;
for (int i = 0; i < arr.Length; i++)
{
arr[i] = arr[i] + 2;
}
}
static void M2(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] = arr[i] + 2;
}
}
static void M1(int n)
{
n = 10;
n++;
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
引用傳遞案例
class Program
{
static void Main(string[] args)
{
//值傳遞:值類型、引用類型
//引用傳遞:值類型、引用傳遞 ref
//1、引用傳遞的是值類型
//int n = 10;
//M1(ref n);
//Console.WriteLine(n);
//Console.ReadKey();
//2、引用傳遞的是引用類型
Person p = new Person();
p.Name = "johnson";
M2(ref p);
Console.WriteLine(p.Name);
Console.ReadKey();
}
private static void M2(ref Person p)
{
p = new Person();
p.Name = "vinson";
}
//ref表示“引用傳遞”,引用傳遞傳遞的不是棧中的數據(對於值類型來說,棧中直接保存數據;對於引用類型來說,棧中保存的是“對象的地址”),而是棧本身的地址
static void M1(ref int m)
{
m++;
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}




作者: WM/Johnson