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)是接口类型时,对象是引用类型,对象在堆中创建
相关文章推荐
- C#中结构体实现接口后是值类型还是引用类型
- C# 学习笔记(四) 结构体实现接口后是值类型还是引用类型
- C#Lab(一):结构体包含引用、结构体实现接口后是引用类型还是值类型
- Java 中到底是应该用接口类型 还是实现类的类类型去引用对象?
- C#引用COM对象,报错:《类型 *** 未定义构造函数, 无法嵌入互操作类型 *** 。请改用适用的接口》的解决办法。
- 关于接口是值类型还是引用类型的猜测
- C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能
- C#中string类型到底是值类型还是引用类型
- C#引用类型转换,到底使用is,as还是显式强转?
- C#中的DateTime是值类型还是引用类型
- ArrayList和LinkedList都是实现了List接口的类,他们都是元素的容器,用于存放对象的引用; 他们都可以对存放的元素进行增删改查的操作,还可以进行排序。 但是,他们还是有区别的。
- C#中的DateTime是值类型还是引用类型
- String到底是值类型还是引用类型(C#)
- 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
- C#中的DateTime是值类型还是引用类型
- C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊
- 数往知来C#之接口 值类型与引用类型 静态非静态 异常处理 GC垃圾回收 值类型引用类型内存分配<四>
- C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现
- go语言实现接口,接受者应该是传值还是传引用(传引用兼容传值)
- 黑马程序员——C#枚举 结构体 this关键字 base关键字 值类型 引用类型 装箱和拆箱