轻松学习C#的结构和类

类和结构是.NET Framework中的同样类型系统的两种基本构造。两者在本质上都属于数据结构,封装这一组整体作为一个逻辑单位的数据和行为。数据和行为是该类或结构的“成员”,它们包含着各自的方法,属性和事件等。
       结构
       结构是C#程序员用来定义自己的值类型的最普遍的机制。结构比枚举更强大,因为它提供方法,字段,操作符和访问控制等。
       结构与类很相似,都表示可以包含数据成员和函数成员的数据结构。但是,与类不同,结构是一种值类型,并且不需要堆分配。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应数据的一个引用(被引用的数据称为“对象”)。
        结构对于具有值语义的小型数据结构尤为有用。复数,坐标系中的点或字典中的“键-值”对都是结构的典型示例。这些数据结构的关键之处在于:他们只是少量数据成员,不要求使用继承或引用标识,而且它们使用较方便(赋值时直接复制值而不是复制它的引用)。
        结构的声明通过关键字struct来实现,声明格式为:
        修饰符   struct   结构名
         {
                 结构主体
          };
         结构声明包含一组可选额特性,后跟一组可选的结构修饰符,再跟关键字struct和一个用于命名结构的标识符,然后跟一个可选的结构接口规范,最后跟一个结构主体,根据需要后面还可以跟一个分号。
        结构声明可以根据需要包含一个结构修饰符:new,public,protected,internal,private
        结构的使用
        为结构定义默认(无参数)构造函数是错误的,在结构体重初始化实例字段也是错误的。初始化结构成员可通过两种形式来完成:一是使用参数化构造函数,二是在声明结构后分别访问成员。对于任何私有成员或以其他方式设置为不可访问的成员,只能在构造函数中进行初始化。
        如果使用new运算符创建结构对象,则会创建该结构对象,并调用适当的构造函数。与类不同的是,结构的实例化可以不使用new运算符。在此情况下不存在构造函数的调用,因而可以提高分配效率。但是,在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
        当结构包含引用类型作为成员时,必须显式调用调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。
例题,创建一个结构,分析结构的使用

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

namespace Text
{
 struct Sum//定义的一个结构
 {
  public int sum(int a, int b)//结构包含的方法
  {
   return a + b;
  }
 }
 class Program
 {
  static void Main(string[] args)
  {
   int p = 10;
   int q = 10;
   Sum t = new Sum();//创建结构对象t
   Console.Write("{0}+{1}=",p,q);
   Console.Write(t.sum(p,q));//调用结构中的方法
   Console.ReadLine();
  }
 }
}
</span>

输出的结果为:10+10=20
        
        类是一种数据结构,它可以封装数据成员(常量和字段),函数成员(方法,属性,事件,索引器,运算符,实例构造函数,静态构造函数和析构函数)和其他的类(嵌套类型)。类是创建对象的模板。C#的一切类型都是类,所有的语句都必须位于类内,不存在任何处于类外的语句。因此,类是C#语言的核心和基本构成模块。类类型支持继承,继承是一种机制,可使派生类对基类进行扩展和专用化。
        类声明中指定的基类可以是构造类类型。基类本身不能是类型形参,但在其作用域中可以包含类型形参。
        在OOP方法中,类是对现实世界的一种高度抽象与概括,而对象则是类的一个实例,对象一定具有其属类的共同特征与行为规则,当然一个对象还可以具有其属类未曾规定的特征和行为规则。这一点和现实生活是相同的,这样的模拟和抽象比较符合人们的思维习惯,这也正是OOP方法具有强大生命力,能够获得越来越多的软件工作者欢迎并得到众多计算机开发商支持的一个基本原因。
       总之,从程序设计者的角度观察,类是一个数据模式和若干个程序过程,经封装而形成的一个整体,是使用信息技术对现实世界的一种模拟与抽象。而对象则是类的一个实例,从程序设计语言来说,对象可以被理解为一个类赋值的结果。对象是OOP方法中组成程序的一种构件。
       C#中类的声明是通过class关键字实例的,格式为:
       修饰符   class 类名: 基类或接口
        {
             类体
        }
        其中“修饰符”,": 基类或接口"为可选项。类的修饰符可以是以下几种之一或者它们的组合(在类的声明()中同一修饰符不允许出现多次)。
       (1)new:仅允许在嵌套类声明时使用,表明类中隐藏了由基类中继承而来的,与基类中同名的成员
       (2)public:表示不限制对该类的访问
       (3)internal:只有其所在类才能访问
       (4)private:只有对.NET中的应用程序或库才能访问
       (5)abstract:抽象类,不允许建立类的实例
       (6)sealed:密封类,不允许被继承
使用new关键字可以建立类的一个实例:

<span style="font-size:18px;"> class A
 {
 }
 class B
 {
  void M()
  {
   A a = new A();
  }
 }</span>
   

类的继承声明:C#语言中只支持单继承

<span style="font-size:18px;"> class A
 {
 }
 class B : A
 {
 }</span>

(1)、构造函数和析构函数
         C#提供了更好的机制来增强程序的安全性。C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题。但是,程序通过了编译检查并不表示错误已经不存在了。
        C#语言充分考虑了程序错误的出现并很好的予以解决,即把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。当对象消亡时,析构函数自动执行。
        构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简单又合理:让构造函数与类名相同。除了名字之外,构造函数的另一个特别之处是没有返回值类型,这是与返回值类型为void的函数不同。
        析构函数是实现销毁一个类的实例的方法成员。析构函数不能有参数,不能有任何修饰符而且不能被调用。析构函数与构造函数目的不同,特在析构函数前加前缀”~“以示区别。
        构造函数和析构函数虽然是一个类中形式上较简单的函数。但它们的使用决非看上去那么简单,因此灵活而正确地使用构造函数和析构函数能够帮助用户更好的理解CLR的内存管理机制以及更好的管理系统中的资源。
(2)、类与对象
       
类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它有一个类名,类名包括属性说明和服务说明两个主要部分。
       对象时系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,反映了该事物在系统中需要保存的信息和发挥的作用,是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。
       类和对象的关系就如模具和铸件的关系,类的实例化的结果就是对象。而对一类对象的抽象就是类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。
例题,创建类A并且在另一个类中调用类A的方法Sum

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; 

namespace Text
{
 class A//创建的类
 {
  public int Sum(int i, int j)//被类封装的方法
  {
   return i + j;
  }
 }
 class Program
 {
  static void Main(string[] args)
  {
   A a = new A();//创建的类A的对象a
   int p = 10;
   int q = 10;
   Console.WriteLine(a.Sum(p,q));//调用类A的Sum方法
   Console.ReadLine();
  }
 } 

}

输出的结果为:20

以上就是关于C#的结构和类的全部知识点,希望对大家的学习有所帮助。

(0)

相关推荐

  • C++联合体转换成C#结构的实现方法

    本文实例主要参考MSDN:http://msdn.microsoft.com/zh-cn/library/ya9bz4ha%28v=vs.80%29.aspx 最近因为项目中遇到了C++联合体转换成C#结构的情况,查了很多资料才转换成功. 备注:对于官方这个UNION示例,我的简单理解,就是这类UNION做法,可适当代替IF ELSE 之类操作. 解决问题:如果只接收视频解码数据,而从不接收音频数据,那么是否可以直接定义结构体,并以此来获取视频数据. /// <summary> /// * @

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

    结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器.结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用.  下面总结一下结构和类的不同: 1.结构是值类型,对结构类型的变量赋值将创建所赋值的一个副本. 2.结构实例的默认值不是null,而是具有默认值的初始值. 3.在结构和类中this的意义不一样. 4.结构不支持继承(所以结构成员的声明可访问

  • 深入解析C#编程中struct所定义的结构

    结构是使用 struct 关键字定义的,例如: public struct PostalAddress { // Fields, properties, methods and events go here... } 结构与类共享大多数相同的语法,但结构比类受到的限制更多: 在结构声明中,除非字段被声明为 const 或 static,否则无法初始化. 结构不能声明默认构造函数(没有参数的构造函数)或析构函数. 结构在赋值时进行复制.将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修

  • C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单. 概括来讲,struct和class的不同体现在: ● 类是引用类型,struct是值类型 ● 在托管堆上创建类的实例,在栈上创建struct实例 ● 类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是

  • 深入探讨C#中的结构struct

    一.结构和类的区别 1.结构的级别和类一致,写在命名空间下面,可以定义字段.属性.方法.构造方法也可以通过关键字new创建对象. 2.结构中的字段不能赋初始值. 3.无参数的构造函数无论如何C#编译器都会自动生成,所以不能为结构定义一个无参构造函数. 4.在构造函数中,必须给结构体的所有字段赋值. 5.在构造函数中,为属性赋值,不认为是对字段赋值,因为属性不一定是去操作字段. 6.结构是值类型,在传递结构变量的时候,会将结构对象里的每一个字段复制一份拷贝到新的结构变量的字段中. 7.不能定义自动

  • C#中结构(struct)的部分初始化和完全初始化实例分析

    本文实例分析了C#中结构(struct)的部分初始化和完全初始化,分享给大家供大家参考.具体分析如下: 假设有这样一个值类型struct,如下所示: public struct Size { public int Length; public int Width; public int Area() { return Length*Width; } } 一.客户端,给所有struct字段初始化后调用方法 class Program { static void Main(string[] args

  • C#中类与结构的区别实例分析

    类与结构是C#程序设计中基本的数据类型,而初学者往往不能很好的分清二者之间的区别.本文就以附带实例形式加以说明.具体如下: 一.基本概念: 类:引用类型,存储在堆中,栈中存储引用地址,在方法的传输中只是传输地址的引用,修改指向的对象会影响原有对象的值,传输中消耗内存小. 结构:值类型,存储在堆栈中,传输过程中传输整个对象的副本,修改指向对象的值不会影响原有的对象,传输中消耗内存大. 二.实例代码如下: class Program { static void Main(string[] args)

  • C#结构体特性实例分析

    本文实例讲述了C#结构体特性.分享给大家供大家参考.具体如下: 结构体的定义: 结构体也可以象类一样可以单独定义. class a{}; struct a{}; 结构体也可以在名字前面加入控制访问符. public struct student{}; internal struct student{}; 如果结构体student没有publice或者internal的声明 类program就无法使用student结构定义 obj对象 如果结构体student的元素没有public的声明,对象ob

  • c#入门之枚举和结构体使用详解(控制台接收字符串以相反的方向输出)

    枚举.结构枚举的类型有限(short.byte...)且是相同的,在MSDN上找到枚举的一些示例,觉得这个还不错: 复制代码 代码如下: enum myWeekDay { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };int i = 3;myWeekDay today = (myWeekDay)i; 枚举是需要先声明的,然后再通过新建一个变量(today)为枚举类型来使用.枚举默认的基本类型值从0开始,递

  • C#枚举类型与结构类型实例解析

    本文以C#实例讲解了枚举类型与结构类型的用法,程序主要是通过个人电话本演示枚举类型与结构类型的用法,具体代码如下所示: using System; class ID { //定义枚举类型 public enum Sex { male, female };//注意别忘了这里的分号 //定义电话本的结构类型 public struct TelBook { public string name; public Sex sex;//性别类型为枚举类型 public string number; } //

  • C#中结构体和字节数组转换实现

    最近在使用结构体与字节数组转化来实现socket间数据传输.现在开始整理一下.对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace FileSendClient { [StructL

  • C# Struct的内存布局问题解答

    问题:请说出以下struct的实例大小以及内存布局 复制代码 代码如下: struct Struct1{    public byte a;    public short b;    public string c;    public int d;} struct Struct2{    public byte a;    public long b;    public byte c;    public string d;} struct Struct3{    byte a;    b

  • c# DataTable与不同结构实体类转换的方法实例

    在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了.的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,由此可见它的效率了.先看一下我的实体类 复制代码 代码如下: /// <summary>/// 具体的实体类,和数据表中不同/// </summary>public class Person{    [D

随机推荐