C#中结构体实现接口后是值类型还是引用类型
[csharp]
[csharp]
namespace _3._12强制类型转换
{
/// <summary>
/// 将派生类的实例强制转化为基类类型总是安全的。甚至也可以将派生类实例转化为抽象基类类型。强制转化为基类型以后,基引用就是派生类对象的基本部分的别名。
/// 将一个值类型强制转化为一个基本接口具有不同的语义。将一个值类型强制转化为一个接口类型时,创建一个不同的实体。接口是引用类型。无论何时将一个值类型
/// 强制转化为引用类型,包括一个值类型转化为一个接口,都会发生装箱操纵。装箱操作分配内存,并将该值类型复制到托管堆上。原始值和副本没有关系,任何一个
/// 发生改变都不会影响另一个。
/// </summary>
public inte易做图ce IAdd {
void Increment();
int Count
{
get;
}
}
public struct XStruct : IAdd {
private int propCount;
public void Increment() {
propCount++;
}
public int Count {
get {
return propCount;
}
}
}
public class Starter {
static void Main() {
XStruct xstruct = new XStruct();
xstruct.Increment();
IAdd obj = xstruct;
xstruct.Increment();
Console.WriteLine(xstruct.Count);//2
Console.WriteLine(obj.Count);//1
//说明obj和xstruct指向不同的实体obj=xstruct创建了一个副本。
//这是类类型很显著的标志
IAdd boj2 = obj;
Console.WriteLine(obj.Count);//1
//说明obi和obj2指向同一个实体对象,obj=obj2是给obj赋值
//这是引用类型的和能显著的标志
Console.ReadKey();
}
}
}
namespace _3._12强制类型转换
{
/// <summary>
/// 将派生类的实例强制转化为基类类型总是安全的。甚至也可以将派生类实例转化为抽象基类类型。强制转化为基类型以后,基引用就是派生类对象的基本部分的别名。
/// 将一个值类型强制转化为一个基本接口具有不同的语义。将一个值类型强制转化为一个接口类型时,创建一个不同的实体。接口是引用类型。无论何时将一个值类型
/// 强制转化为引用类型,包括一个值类型转化为一个接口,都会发生装箱操纵。装箱操作分配内存,并将该值类型复制到托管堆上。原始值和副本没有关系,任何一个
/// 发生改变都不会影响另一个。
/// </summary>
public inte易做图ce IAdd {
void Increment();
int Count
{
get;
}
}
public struct XStruct : IAdd {
private int propCount;
public void Increment() {
propCount++;
}
public int Count {
get {
return propCount;
}
}
}
public class Starter {
static void Main() {
XStruct xstruct = new XStruct();
xstruct.Increment();
IAdd obj = xstruct;
xstruct.Increment();
Console.WriteLine(xstruct.Count);//2
Console.WriteLine(obj.Count);//1
//说明obj和xstruct指向不同的实体obj=xstruct创建了一个副本。
//这是类类型很显著的标志
IAdd boj2 = obj;
Console.WriteLine(obj.Count);//1
//说明obi和obj2指向同一个实体对象,obj=obj2是给obj赋值
//这是引用类型的和能显著的标志
Console.ReadKey();
}
}
}
在C#中数据类型分为值类型和引用类型
值类型:结构体、枚举
引用类型:类、接口、数组、委托
最后得出结论:
当我们声明对象(s1、s2)是结构体类型时,对象是值类型,对象在栈中创建
当我们声明对象(ic1、ic2)是接口类型时,对象是引用类型,对象在堆中创建
补充:软件开发 , C# ,