C# 学习教程七
虾米哥
阅读:650
2021-04-01 10:02:54
评论:0
结构可以实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
struct myBook
{
public int price;
}
myBook mybook;
mybook.price=10;
1,结构是值类型,类是引用类型
注:a,值类型在堆栈上分配地址,引用类型在堆上分配地址(堆栈的执行效率比堆高,但是堆栈的资源有限,适用于简单的逻辑 处理,如:基本类型中int 对应的 system.Int32等都是结构)
b,值类型的赋值可以创造新的值类型,而引用类型之间的赋值是复制引用的地址
c,结构和类的基类都是object,c#所有的类型的基类都是object
d,虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用new,那么在初始化所有 字段之前,字段将保持未赋值状态,且对象不可用
2, 结构(struct)不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed
类(class)完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:结构可以使用和类相同的办法继承接口(有点奇怪)
3,和类相比,结构没有默认的构造函数,但可以添加构造函数,没有析构函数,因为不能继承,所以没有abstruct和sealed 不能用proteced修饰, 并且可以不用new初始化,结构中不能初始化字段。
实例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Hello_World
{
public class Conversion
{
public static void Main(string[] args)
{
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();
}
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);
}
}
}
}
效果截图
1.struct 是值类型,class 是对象类型
2.struct 不能被继承,class 可以被继承
3.struct 默认的访问权限是public,而class 默认的访问权限是private.
4.struct总是有默认的构造函数,即使是重载默认构造函数仍然会保留。这是因为Struct的构造函数是由编译器自动生成的,但是如果重载构造函数,必需对struct中的变量全部初始化。并且Struct的用途是那些描述轻量级的对象,例如Line,Point等,并且效率比较高。class在没有重载构造函数时有默认的无参数构造函数,但是一被重载些默认构造函数将被覆盖。
5.struct的new和class的new是不同的。struct的new就是执行一下构造函数创建一个新实例再对所有的字段进行Copy。而class则是在堆上分配一块内存然后再执行构造函数,struct的内存并不是在new的时候分配的,而是在定义的时候分配
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。