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的时候分配的,而是在定义的时候分配 
标签:C#
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号