您的位置:首页 > 编程语言 > C#

C#中结构体实现接口后是值类型还是引用类型

2013-04-25 08:52 351 查看
namespace_3._12强制类型转换
{
///<summary>
///将派生类的实例强制转化为基类类型总是安全的。甚至也可以将派生类实例转化为抽象基类类型。强制转化为基类型以后,基引用就是派生类对象的基本部分的别名。
///将一个值类型强制转化为一个基本接口具有不同的语义。将一个值类型强制转化为一个接口类型时,创建一个不同的实体。接口是引用类型。无论何时将一个值类型
///强制转化为引用类型,包括一个值类型转化为一个接口,都会发生装箱操纵。装箱操作分配内存,并将该值类型复制到托管堆上。原始值和副本没有关系,任何一个
///发生改变都不会影响另一个。
///</summary>
publicinterfaceIAdd{
voidIncrement();
intCount
{
get;
}
}
publicstructXStruct:IAdd{
privateintpropCount;
publicvoidIncrement(){
propCount++;
}
publicintCount{
get{
returnpropCount;
}
}
}
publicclassStarter{
staticvoidMain(){
XStructxstruct=newXStruct();
xstruct.Increment();
IAddobj=xstruct;
xstruct.Increment();
Console.WriteLine(xstruct.Count);//2
Console.WriteLine(obj.Count);//1
//说明obj和xstruct指向不同的实体obj=xstruct创建了一个副本。
//这是类类型很显著的标志
IAddboj2=obj;
Console.WriteLine(obj.Count);//1
//说明obi和obj2指向同一个实体对象,obj=obj2是给obj赋值
//这是引用类型的和能显著的标志
Console.ReadKey();
}
}
}

在C#中数据类型分为值类型和引用类型

值类型:结构体、枚举

引用类型:类、接口、数组、委托

最后得出结论:

当我们声明对象(s1、s2)是结构体类型时,对象是值类型,对象在栈中创建

当我们声明对象(ic1、ic2)是接口类型时,对象是引用类型,对象在堆中创建
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐