C#基础语法:结构和类区别详解

所属分类: 软件编程 / C#教程 阅读数: 146
收藏 0 赞 0 分享

结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用。

 下面总结一下结构和类的不同:

1.结构是值类型,对结构类型的变量赋值将创建所赋值的一个副本。
2.结构实例的默认值不是null,而是具有默认值的初始值。
3.在结构和类中this的意义不一样。
4.结构不支持继承(所以结构成员的声明可访问性不能是protected,protected internal,结构中的函数成员不能是abstract 或者virtual,所以在结构中override修饰符只适用于重写从System.ValueType继承的方法)但是可以实现接口。
5.在结构中实例字段声明中不能含有变量的初始值设定项
6.在结构中不能声明无参数的实例构造函数。
7.在结构中不能声明析构函数。

测试区别特性代码:
 

using System;
namespace StructAndClass
{
  struct SPoint
  {
    public int x, y;
    public SPoint(int x, int y)
    {
      this.x = x;
      this.y = y;
    }
  }
  class CPoint
    {
      public int x, y;
      public CPoint(int x, int y)
      {
        this.x = x;
        this.y = y;
      }
    }
  class Test
  {
    public static void Main()
    {
      SPoint sp1 = new SPoint(2, 5);
      Console.WriteLine("结构/sp1初始值:");
      Console.WriteLine("sp1.x={0}", sp1.x);
      SPoint sp2 = sp1;
      Console.WriteLine("sp1=sp2后:");
      Console.WriteLine("sp1.x={0}");
      Console.WriteLine("sp1.x={0}", sp1.x);
      Console.WriteLine("sp2.x={0}", sp2.x);
      sp1.x = 5;
      Console.WriteLine("再次改变sp1的值后:");
      Console.WriteLine("sp1.x={0}", sp1.x);
      Console.WriteLine("sp2.x={0}", sp2.x);
      Console.WriteLine("============================");
      CPoint cp1 = new CPoint(2,5);
      Console.WriteLine("类/cp1初始值:");
      Console.WriteLine("cp1.x={0}", cp1.x);
      CPoint cp2 = cp1;
      Console.WriteLine("cp1=cp2后:");
      Console.WriteLine("cp1.x={0}", cp1.x);
      Console.WriteLine("cp2.x={0}", cp2.x);
      cp1.x = 5;
      Console.WriteLine("再次改变cp1的值后:");
      Console.WriteLine("cp1.x={0}", cp1.x);
      Console.WriteLine("cp2.x={0}", cp2.x);
      Console.ReadKey();
    }
  }
}


对于结构,即使没有new运算符声明的结构变量也是有效的,结构虽然不能声明无参数的实力构造函数,但是它其实隐式的包含了一个无参数的构造函数:而且在结构的所有字段没有明确赋值之前,不能调用结构的实例函数成员。在结构的构造函数中应该给所有的字段赋值。例如:
 

struct DC
  {
    public int x, y;
    public int X
    {
      set
      {
        x = value;
      }
      get
      {
        return x;
      }
    }
    public int Y
    {
      set
      {
        y = value;
      }
      get
      {
        return y;
      }
    }
    public DC(int x,int y)
    {
      this.x = x;
      this.y = y;
    }
  }
  struct RDC
  {
    public int x, y;
    public int X
    {
      set
      {
        x = value;
      }
      get
      {
        return x;
      }
    }
    public int Y
    {
      set
      {
        y = value;
      }
      get
      {
        return y;
      }
    }
    public RDC(int x, int y)
    {
      this.x = x;
      this.y = y;
    }
  }
  class Test
  {
    public static void Main()
    {
      DC dc=new DC();
      dc.x = 3;
      dc.y = 5;
      Console.WriteLine("已经对x,y初始化后:");
      Console.WriteLine("此时可以访问和修改dc.X={0}的值",dc.X);
      Console.WriteLine("我在这里创建了一个DC的复制结构RDC/n并且不对x,y初始化就会报错");
      RDC rdc;
       rdc.y = 5;//可以编译通过
       rdc.X = 3;//这里就会出错,不能编译通过
      Console.WriteLine("=======test over================");
     }
  }

 

在结构的实例构造函数内,this 相当于一个结构类型的 out 参数,(必须在内部对它明确赋值)而在结构的实例函数成员内,this 相当于一个结构类型的 ref 参数。在这两种情况下,this 本身相当于一个变量,因而有可能对该函数成员调用所涉及的整个结构进行修改(如对 this 赋值,或者将 this 作为 ref 或 out 参数传递)。例如:(引用上面的例子)

 

struct DC
  {
    public int x, y;
    public int X
    {
      set
      {
        x = value;
      }
      get
      {
        return x;
      }
    }
    public int Y
    {
      set
      {
        y = value;
      }
      get
      {
        return y;
      }
    }
    public DC(int x,int y)
    {
      X= x;//这里就是错的
      Y = y;//会提示没有给this对象的所有字段赋值
    }
  }

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多