值类型、引用类型 再次理解

本文通过实例深入解析了C#中的值类型和引用类型的区别,包括它们的存储位置、赋值行为以及如何影响函数参数传递的效果。

重新理解一下C#中的值类型和引用类型,在以前读《C#高级编程(第三版)》时,也是粗略看了一下,没有在意,直到今天,重新认识了这个东西。

一、值类型:存储在堆栈中;引用类型:存储在托管对上;

二、值类型进行“=”操作时,会创建值类型的复制版本;

值类型:

int i = 20;

int j= i;

Console.WriteLine(string.Format("i={0}/tj={1}", i.ToString(), j.ToString())); // i = 20,j = 20

j = 30;

Console.WriteLine(string.Format("i={0}/tj={1}", i.ToString(), j.ToString())); // i = 20,j = 30

引用类型:[建设已经定义了一个 Example 类]

ExampleexI = new Example ();

exI .i = 20;

ExampleexJ = exI;

Console.WriteLine(string.Format("exI.i={0}/texJ .i={1}", exI.i.ToString(), exJ .i.ToString())); // 20,20

exJ.i = 30;

Console.WriteLine(string.Format("exI.i={0}/texJ .i={1}", exI.i.ToString(), exJ .i.ToString())); // 30,30

[说明:引用类型中,不用 string 做事例是因为它太特殊了,最主要的是自己还没有弄清楚这个东西,但是直到一点:“string 是引用类型,表现上却是值类型的特征。”,不知道为什么这么说?]

三、理解值类型和引用类型。值类型就是基本类型,int,long,double,bool,struct,enum 都是值类型;引用类型就是string 和自定义类 [面向对象里面的对象],可以将引用类型看成C++ 或 C中的指针,都指向内存中的一个地址,修改任何一个指向这个地址对象,其他的对象值都改变。这个东西的监视是由CLR负责接管的,不用我们操心了。

四、引用类型可以帮助返回函数处理后,类型的值。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
// 外围设置值
int j = 200;
string str = "out string";
example ex = new example(100, "out property");

// 显示当前值
Console.WriteLine("Before test():/n/tex.i={0}/tex.str={1}/tj={2}/tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);

// 函数中更改值
test(ex,j,str);

// 显示调用后值
Console.WriteLine("After test():/n/tex.i={0}/tex.str={1}/tj={2}/tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);


Console.Read();
}

private static void test(example ex, int j, string str)
{
// 函数内更改各值
j = 880; // 值类型
str = "inner string"; // 引用类型,表现为值类型 [最特殊]
ex.i = 880; // 引用类型,值类型属性
ex.str = "inner property"; // 引用类型,引用类型属性

// 显示更改后的值
Console.WriteLine("Inner test():/n/tex.i={0}/tex.str={1}/tj={2}/tstr={3}", ex.i.ToString(), ex.str, j.ToString(), str);
}
}

internal class example
{
public int i = 0;
public string str = "example string";

public example(int j, string s)
{
this.i = j;
this.str = s;
}
}
}

结果:

Before test():
ex.i=100 ex.str=out property j=200 str=out string
Inner test():
ex.i=880 ex.str=inner property j=880 str=inner string
After test():
ex.i=880 ex.str=inner property j=200 str=out string

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值