了解C#字符串类型
这篇文章的目的是要揭示一些与DOTNET和C #相关的常见和不常见的问题,在这些问题中,我的第一篇文章是字符串数据类型,字符串数据类型是引用类型,但许多开发商可能并不完全理解它的行为与其他引用类型的比较。
问题
对于一个公共引用类型,当对象别名的值发生变化时,这个变化也显示在一个真实对象中,反之亦然。
解释
引用类型
假设我们有一个类MyType,其中有一个属性名;我们也有一个类apptype,它提供的主要()运行程序的方法。
现在,让我们来看一下代码:
使用系统;
类MyType
{
专用字符串名;
公共字符串名称
{
集
{
名称=值;
}
得到
{
返回的名称;
}
}
}
类apptype
{
公共静态空主()
{
MyType obj1,obj2;
console.writeline(*****参考学习哲学***** );
obj2 =新的MyType();
obj2。名称=萨迪克;
obj1,obj2;
console.writeline(价值= { 0 } obj1和obj2 = { 1 }
以此名称=艾哈迈德;
console.writeline(价值= { 0 } obj1和obj2 = { 1 }
}
}
编译和运行此代码时,将获得以下输出:
学习参考哲学
对萨迪克和obj2 obj1 = =萨迪克值
对艾哈迈德和obj2 obj1 = =艾哈迈德值
这表明obj1是obj2的别名,换句话说,两obj1和obj2指向相同的内存空间。
值类型
它与上面的代码类似。不像这一次,我们定义了MyType作为一个阶级,和其他部分都是相同的。让我们先看看代码:
使用系统;
结构很重要
{
专用字符串名;
公共字符串名称
{
集
{
名称=值;
}
得到
{
返回的名称;
}
}
}
类apptype
{
公共静态空主()
{
MyType obj1,obj2;
console.writeline(*****参考学习哲学***** );
obj2 =新的MyType();
obj2。名称=萨迪克;
obj1,obj2;
console.writeline(价值= { 0 } obj1和obj2 = { 1 }
以此名称=艾哈迈德;
console.writeline(价值= { 0 } obj1和obj2 = { 1 }
}
}
让我们看看上面运行的代码的输出:
学习参考哲学
对萨迪克和obj2 obj1 = =萨迪克值
对艾哈迈德和obj2 obj1 = =萨迪克值
This shows that obj1 is not the same as obj2, that is, they point to different memory spaces.
引用类型或值类型
现在,让我们来看一下直接使用字符串类型的情况:
使用系统;
类apptype
{
公共静态空主()
{
字符串obj1,obj2;
console.writeline(*****参考学习哲学***** );
不需要它
/ / obj2 =新的MyType();
Obj2= Sadiq;
obj1,obj2;
慰问.WriteLine(价值= { 0 } obj1和obj2 = { 1 }
obj1 = 艾哈迈德;
console.writeline(价值= { 0 } obj1和obj2 = { 1 }
}
}
运行此代码时,您将得到:
学习参考哲学
对萨迪克和obj2 obj1 = =萨迪克值
对艾哈迈德和obj2 obj1 = =萨迪克值
这表明obj1不是别名obj2,即obj1和obj2指向不同的存储空间。
真奇怪!的确!我们都知道字符串类型是动态增长的,这表明它必须在堆上分配内存。为什么它显示了与值类型相同的属性
原因
关键在于以下两行代码:
字符串obj1;
obj1 =价值的力量分配内存;
第一行代码只定义了一个对象,它不创建一个对象;第二行代码将真正创建一个对象:
obj =新的字符串(价值的力量分配内存);。
总结
所以,当你初始化一个值的字符串对象或给它一个新的字符串,你会在内存中创建一个新的对象。现在,我们应该明白,在第三例obj1不是obj2的别名,他们指出,不同的存储空间。