了解C#字符串类型

了解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的别名,他们指出,不同的存储空间。

tag:类型字符串电脑软件

相关内容