一、值类型与引用类型区分
正确理解值类型与引用类型,可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序:
|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 区别 | 值类型 | 引用类型 |
| 定义 | 所有继承自【System.ValueType】类型的都是值类型(valueType继承自System.Object),如常见基础数据类型【byte,short,int,long,float,double,decimal,char,bool 、enum和 struct】都是值类型 | 所有不继承 【System.ValueType】类型都都是引用类型;对于C#而言所有以【Class】关键字定义的内容都是引用类型;【string、class】都是引用类型 |
| 变量赋值 | 值类型的变量赋值是直接获取到一个真实数据副本**;变量与数据是【一对一的关系】互不影响** | 引用类型赋值只是把对象的引用赋给变量; 变量与数据对象是【多对一的关系】相互影响 |
| 内存分配 | **【值类型】**变量声明后,不管是否已经赋值,编译器为其在【线程栈】分配【静态内存】,【栈内分配空间大小因变量类型而异】 线程栈的空间相对有限,但运行效率比堆高的多 | **【引用类型】**声明一个类时,只在线程栈中分配一小片内存空间用于容纳一个数据对象地址,且此时没有为其分配堆上的数据对象内存空间;只有使用 new 关键字创建一个类的实例时,才会分配堆上的空间,并把堆上空间的地址保存到线程栈上分配的小片空间中 |
| 继承结构 | **【值类型】**都继承自【System.ValueType】,它们的比较方法【ValueType.Equals(Object)】实现了【数据内容的比较】 | **【引用类型】**都继承自【System.Object】,它们的比较方法【Object.Equals(Object)】实现的是【引用相等性;等效于调用 Object.ReferenceEquals】 System.Object.Equals 方法 - .NET | Microsoft Learn |
| 使用场景 | **【值类型】**在内存管理方面具有更好的效率,并且不支持多态,【适合用做存储数据的载体】 判断使用值类型依据: ①只用于数据存储; ②永远不可能有子类; ③没有多态行为; | **【引用类型】**支持多态,【适合用于定义应用程序的行为】 C#面向对象的三大特性(封装、继承、多态) |
[C#值类型与引用类型区别]
C#的两种类据类型:值类型和引用类型_c# .value2-CSDN博客文章浏览阅读4.7k次,点赞5次,收藏18次。一、什么是值类型,什么是引用类型概念:值类型直接存储其值,而引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。引用类型:基类为Objcet值类型:均隐式派生自System.ValueType:值类型:byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。..._c# .value2https://blog.csdn.net/xiaochenXIHUA/article/details/90202915 C#的字符串之String类与StringBuilder类区别于适用场景-CSDN博客文章浏览阅读1k次,点赞7次,收藏27次。C#中的字符串类String与StringBuilder有什么区别?对应的适用场景是什么?
https://coffeemilk.blog.csdn.net/article/details/146288410
二、值类型与引用类型示例
cs
public class InfluxDBConPara
{
public string Url { get; set; }
public string Token { get; set; }
public string User { get; set; }
public string Pwd { get; set; }
public string BucketName { get; set; }
public string Org { get; set; }
}
public struct InfluxDbConPara
{
public string Url { get; set; }
public string Token { get; set; }
public string User { get; set; }
public string Pwd { get; set; }
public string BucketName { get; set; }
public string Org { get; set; }
}
cs
public class InfluxdbOfficialHelper
{
#region 基础参数
//类
private InfluxDBConPara influxDBConPara;
//结构体
private InfluxDbConPara influxDbConPara;
#endregion
public InfluxdbOfficialHelper(string url,string token)
{
this.influxDBClient = new InfluxDBClient(url,token);
influxDBConPara = new InfluxDBConPara();
influxDBConPara.Url = url;
influxDBConPara.Token = token;
influxDbConPara = new InfluxDbConPara();
influxDbConPara.Url = url;
influxDbConPara.Token = token;
}
public InfluxDBConPara GetInfluxDBConPara
{
get
{
return influxDBConPara;
}
}
public InfluxDbConPara GetInfluxDbConPara
{
get
{
return influxDbConPara;
}
}
public void ToSting()
{
string str = $"InfluxDB参数 【 URL:{influxDBConPara.Url}】【Token:{influxDBConPara.Token}】【User:{influxDBConPara.User}】【Pwd:{influxDBConPara.Pwd}】" +
$"【BucketName:{influxDBConPara.BucketName}】【Org:{influxDBConPara.Org}】";
Console.WriteLine(str);
}
public void ToSting2()
{
string str = $"InfluxDB参数 【 URL:{influxDbConPara.Url}】【Token:{influxDbConPara.Token}】【User:{influxDbConPara.User}】【Pwd:{influxDbConPara.Pwd}】" +
$"【BucketName:{influxDbConPara.BucketName}】【Org:{influxDbConPara.Org}】";
Console.WriteLine(str);
}
cs
public static void Test()
{
InfluxdbOfficialHelper influxdbOfficialHelper = new InfluxdbOfficialHelper("http://192.168.3.208:8086", "teshjflasjflsfj");
Console.WriteLine("----------------引用类型【类】测试--------------------");
InfluxDBConPara influxDBConPara2 = influxdbOfficialHelper.GetInfluxDBConPara;
influxdbOfficialHelper.ToSting();
influxDBConPara2.Url = "修改URL";
influxDBConPara2.Token = "修改Token";
influxDBConPara2.User = "修改用户";
influxDBConPara2.Pwd = "修改密码";
influxDBConPara2.BucketName = "修改数据库";
influxDBConPara2.Org = "修改Org";
influxdbOfficialHelper.ToSting();
Console.WriteLine("------------值类型【结构】测试---------------");
InfluxDbConPara influxDbConPara2 = influxdbOfficialHelper.GetInfluxDbConPara;
influxdbOfficialHelper.ToSting2();
influxDbConPara2.Url = "修改Token";
influxDbConPara2.Token = "修改Token";
influxDbConPara2.User = "修改用户";
influxDbConPara2.Pwd = "修改密码";
influxDbConPara2.BucketName = "修改数据库";
influxDbConPara2.Org = "修改Org";
influxdbOfficialHelper.ToSting2();
}
执行结果如下:

此次示例的值类型与引用类型效果图如下:

三、关于此次值类型与引用类型的小结
《1》如果我们需要对类进行实例化之后,对外提供的实例化参数内容**【不可修改】,那么我们的参数内容就需要使用【值类型】** (必须使用常见基础数据类型【byte,short,int,long,float,double,decimal,char,bool 、enum和 struct】作为变量内容)。
《2》如果我们需要对类进行实例化之后,对外提供的实例化参数内容**【可随便修改】** ,那么我们的参数内容就需要使用**【引用类型】**(必须使用【string、class】作为变量内容)。