c#语言基础(6)----结构(struct)和类(class)的 区别
2008-11-28 14:18
579 查看
1,结构是值类型,类是引用类型
注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑 处理,如:基本类型中int 对应的 system.Int32等都是结构) b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址 c,结构和类的基类都是object,c#所有的类型的基类都是object d,虽然结构的初始化也使用了New
操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有 字段之前,字段将保持未赋值状态,且对象不可用
2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed 类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:结构可以使用和类相同的办法继承接口(有点奇怪)
3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以 没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。
下面是一个类和结构的例子:
struct SPerson{
//public SPerson(){}//Error:结构不能包含显式的无参数构造函数
public SPerson(string name,int age)
{
this.name=name;
this.age=age;
}
//public int =2; //Error:类、结构或接口成员声明中的标记“=”无效
private string name;
private int age;
public string Name{get{return name;}set{name=value;}}
public int Age{get{return age;}set{this.age=value;}}
public override string ToString(){
return string.Format("Struct:Name:{0},Age:{1}",this.name,this.age);
}
}
class CPerson{
public CPerson(){}
public CPerson(string name,int age){
this.name=name;
this.age=age;
}
private string name;
private int age;
public string Name{get{return name;}set{name=value;}}
public int Age{get{return age;}set{age=value;}}
public override string ToString(){
return string.Format("Class:Name:{0},Age:{1}",this.name,this.age);
}
}
public class MyClass{
public static void Main()
{
CPerson cp1=new CPerson("Zhang San",23);
SPerson sp1=new SPerson("Zhang San",23);
Console.WriteLine("First Class:cp1:"+cp1.ToString());
//输出:First Class:cp1:Name:Zhang San,Age:23
Console.WriteLine("First Struct: sp1:"+sp1.ToString());
//输出:First Struct: sp1:Name:Zhang San,Age:23
CPerson cp2=cp1;//cp2引用cp1
SPerson sp2=sp1;//cp2的值为cp1内的值
Console.WriteLine("Second Class:cp2:"+cp2.ToString());
//输出:Second Class:cp2:Name:Zhang San,Age:23
Console.WriteLine("Second Struct: sp2:"+sp2.ToString());
//输出:Second Struct: sp2:Name:Zhang San,Age:23
Console.ReadKey();
Console.WriteLine("Change First Class And Struct:");
//改变值:
cp1.Name="Wang Wu";
cp1.Age=100;
sp1.Name="Wang Wu";
sp1.Age=100;
Console.WriteLine("Afte Change first Class cp1:"+cp1.ToString());
//输出:Afte Change first Class cp1: cp1:Name:Wang Wu,Age:100
Console.WriteLine("Afte Change first Struct sp1:"+sp1.ToString());
//输出:Afte Change first Struct sp1:Name:Wang Wu,Age:100
Console.WriteLine("Afte Change First Class, Second Class cp2:"+cp2.ToString());
//输出:Afte Change First Class, Second Class cp2:Name:Wang Wu,Age:100
//------------------------------------------------------------------------------------------------------------
//值类型:
Console.WriteLine("Afte Change First Struct, Second Struct sp2:"+sp2.ToString());
//输出:AAfte Change First Struct, Second Struct sp2:Name:Zhang San,Age:23
//-------------------------------------------------------------------------------------------------------------
Console.ReadKey();
}
}
注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑 处理,如:基本类型中int 对应的 system.Int32等都是结构) b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址 c,结构和类的基类都是object,c#所有的类型的基类都是object d,虽然结构的初始化也使用了New
操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有 字段之前,字段将保持未赋值状态,且对象不可用
2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed 类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:结构可以使用和类相同的办法继承接口(有点奇怪)
3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以 没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。
下面是一个类和结构的例子:
struct SPerson{
//public SPerson(){}//Error:结构不能包含显式的无参数构造函数
public SPerson(string name,int age)
{
this.name=name;
this.age=age;
}
//public int =2; //Error:类、结构或接口成员声明中的标记“=”无效
private string name;
private int age;
public string Name{get{return name;}set{name=value;}}
public int Age{get{return age;}set{this.age=value;}}
public override string ToString(){
return string.Format("Struct:Name:{0},Age:{1}",this.name,this.age);
}
}
class CPerson{
public CPerson(){}
public CPerson(string name,int age){
this.name=name;
this.age=age;
}
private string name;
private int age;
public string Name{get{return name;}set{name=value;}}
public int Age{get{return age;}set{age=value;}}
public override string ToString(){
return string.Format("Class:Name:{0},Age:{1}",this.name,this.age);
}
}
public class MyClass{
public static void Main()
{
CPerson cp1=new CPerson("Zhang San",23);
SPerson sp1=new SPerson("Zhang San",23);
Console.WriteLine("First Class:cp1:"+cp1.ToString());
//输出:First Class:cp1:Name:Zhang San,Age:23
Console.WriteLine("First Struct: sp1:"+sp1.ToString());
//输出:First Struct: sp1:Name:Zhang San,Age:23
CPerson cp2=cp1;//cp2引用cp1
SPerson sp2=sp1;//cp2的值为cp1内的值
Console.WriteLine("Second Class:cp2:"+cp2.ToString());
//输出:Second Class:cp2:Name:Zhang San,Age:23
Console.WriteLine("Second Struct: sp2:"+sp2.ToString());
//输出:Second Struct: sp2:Name:Zhang San,Age:23
Console.ReadKey();
Console.WriteLine("Change First Class And Struct:");
//改变值:
cp1.Name="Wang Wu";
cp1.Age=100;
sp1.Name="Wang Wu";
sp1.Age=100;
Console.WriteLine("Afte Change first Class cp1:"+cp1.ToString());
//输出:Afte Change first Class cp1: cp1:Name:Wang Wu,Age:100
Console.WriteLine("Afte Change first Struct sp1:"+sp1.ToString());
//输出:Afte Change first Struct sp1:Name:Wang Wu,Age:100
Console.WriteLine("Afte Change First Class, Second Class cp2:"+cp2.ToString());
//输出:Afte Change First Class, Second Class cp2:Name:Wang Wu,Age:100
//------------------------------------------------------------------------------------------------------------
//值类型:
Console.WriteLine("Afte Change First Struct, Second Struct sp2:"+sp2.ToString());
//输出:AAfte Change First Struct, Second Struct sp2:Name:Zhang San,Age:23
//-------------------------------------------------------------------------------------------------------------
Console.ReadKey();
}
}
相关文章推荐
- c#中类与结构的区别 struct与class的区别
- C#中结构(struct)与类(class)的区别
- c#基础 01.2 结构类型struct与类class的异同
- C++和C#中的class和struct区别
- struct 与class的区别 C#与C++的区别
- c#中class和struct区别
- C#中Struct与Class的区别
- C#中Struct与Class的区别
- C#中Struct与Class的区别
- C# 中 Struct 与 Class 的区别
- C#中class和struct的区别
- C#中Struct与Class的区别
- C#中class与struct的区别
- C# Struct和Class的区别
- 用结构(STRUCT)和类(CLASS)定义一个类的区别
- C#中Struct与Class的区别
- c#中Class和Struct使用与性能的区别
- C#中struct和class的区别详解
- C++中struct与class结构的区别
- C#经典面试题 C# 中 Struct 与 Class 的区别,以及两者的适用场合