c#结构和类的相关介绍

我们不关心对象内部是怎么实现的,我们关心的是他提供给我什么接口,有什么操作。从技术上来说,结构属于值类型,而类属于引用类型。结构不能指定继承基类类型,类可以。不过结构和类都能实现接口。
一、应用场合
结构的应用场合:

一、自定义数据类型,数据成员是公开的,提供工具函数。

二、抽象的数据类型,数据成员是密封的,提供相关的数据操作函数。

总之,都是围绕数据作文章。

类的应用场合:

一、提供一组类,形成一个有机整体,形成一个系统,类数据成员是密封的,只提供相互通信的函数接口。

类主要通过不同的类组成一个类间通信的系统。而类自身是整个系统的一部分。

二、成员和可访问性
作为抽象数据类型的工具,类和结构提供了丰富的封装功能。

1.字段定义数据成员,无封装

2.属性封装字段的访问方式

3.函数提供可用操作

4.事件提供了处理消息的模型

5.索引器封装了数据集合

另外

构造函数、析构函数负责初始化和清理垃圾(在c#中需要使用IDispose模式)

对于成员,可以有三大类,1、类成员,所有实例共享;(static 修饰)2、对象公开成员;(public 修饰)3、对象私有成员。其中公开成员是最重要的,私有成员属于内部实现细节。

公开成员是对象的特征,因为对于使用者来说,只能通过公开成员和对象进行互动。可以通过提取公开成员,形成一个独立接口,用来隔离具体的实现。这样,设计者便可以提供不同的类实现给客户。

三、泛型和接口
类和结构的共同点都是属于实现,而接口属于规范,客户端应该避免直接接触具体的实现,否则客户端就需要根据实现的变化而变化,这明显是不经济的。但是类和结构又有差别,类侧重行为,因此和接口更加搭配;而结构侧重数据,而接口是没有数据的,并且接口属于引用类型,当结构作为值类型转化成接口,就会产生装箱,会有性能问题。因此,接口一般不会配合结构来使用,而结构应该作为更加单纯的数据单元,不应该添加太多功能性。如果需要设计功能丰富的组件,最好是基于类来实作。当结构作为数据单元,它要修改设计的余地很少,因为数据单元的应用场合更多是被其他人修改,不具太多自主性。结论是结构自身便可以作为规范。

泛型是未完成的类型,因此提供了客户端自定义类型的机会。泛型的每一个实例,都共享相同或者类似的代码,那么客户端需要泛型的理由是什么?

c#是强类型的系统,就算逻辑上一样,因为类型不同,在编译器看来都是完全不同的代码。当客户端需要为不同类型采取相同的逻辑的时候,泛型就提供了一个快捷的,越过强类型限制的渠道。比如有个int + int 和 float + float在我们人类看来几乎是一摸一样,但是强类型的编译器要求你重复书写代码,泛型能做到T + T,然后让客户端用可支持+操作的参数生成任何类型。

从客户端的角度,它不在乎实现是怎样的,它在乎的是接口是怎样的。泛型对客户端的意义在于强化了接口,从提供特定类型的接口到提供满足特定条件的一定范围内的类型的新型接口。这就让可用性大大增强。(按照实际应用情况,我们应该将泛型视为常态,单一类型的接口才是特殊态)。

(0)

相关推荐

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

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

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

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

  • 深入c# 类和结构的区别总结详解

    类和结构的区别:1.一个是引用类型一个是值类型Class是引用类型,继承自System.Object类Struct是值类型,继承自System.ValueType类,因此不具有多态性因为结构是值类型,所以结构之间赋值可以创建新的结构,复制包含结构的变量时,讲复制所有的数据,对新的副本所作的修改都不会改变旧副本的数据,而类是引用类型,类之间的赋值只是复制引用.2. 继承性的区别Class支持继承,可以继承自类和接口,是完全可扩展的,除非声明sealed.否则类可以继承自其它的类的接口,自身也能被继

  • 基于c# 类、接口、结构的联系与区别详解

    一.C#类与结构的差别1. 值类型与引用类型结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象.所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋

  • 轻松学习C#的结构和类

    类和结构是.NET Framework中的同样类型系统的两种基本构造.两者在本质上都属于数据结构,封装这一组整体作为一个逻辑单位的数据和行为.数据和行为是该类或结构的"成员",它们包含着各自的方法,属性和事件等.        结构        结构是C#程序员用来定义自己的值类型的最普遍的机制.结构比枚举更强大,因为它提供方法,字段,操作符和访问控制等.        结构与类很相似,都表示可以包含数据成员和函数成员的数据结构.但是,与类不同,结构是一种值类型,并且不需要堆分配.结

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

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

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

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

  • c#结构和类的相关介绍

    我们不关心对象内部是怎么实现的,我们关心的是他提供给我什么接口,有什么操作.从技术上来说,结构属于值类型,而类属于引用类型.结构不能指定继承基类类型,类可以.不过结构和类都能实现接口. 一.应用场合结构的应用场合: 一.自定义数据类型,数据成员是公开的,提供工具函数. 二.抽象的数据类型,数据成员是密封的,提供相关的数据操作函数. 总之,都是围绕数据作文章. 类的应用场合: 一.提供一组类,形成一个有机整体,形成一个系统,类数据成员是密封的,只提供相互通信的函数接口. 类主要通过不同的类组成一个

  • C++类的大小介绍

    1.C++结构体和类的关系 为什么讲C++类的大小要提到结构体呢,因为可能很多和我一样的学子,接触过C语言的结构体对齐,但不明白类的大小怎么计算,这其中都要用到内存对齐的概念,对于内存对齐的概念之前已经说过了,可以参考这篇博客:C++结构体字节对齐和共用体大小  明白结构体的内存大小计算后,就要明白类和结构体的关系: 在C++中,结构体和类的唯一区别就是:  结构体和类具有不同的默认访问控制属性. 类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private). 结构体中,对于未

  • PHP树形结构tree类用法示例

    本文实例讲述了PHP树形结构tree类用法.分享给大家供大家参考,具体如下: <?php include 'tree.class.php'; //模拟数据库 $data=array( array('id'=>1,'pid'=>0,'name'=>'一级栏目一'), array('id'=>2,'pid'=>0,'name'=>'一级栏目二'), array('id'=>3,'pid'=>1,'name'=>'二级栏目一'), array('id'

  • Python爬虫之Spider类用法简单介绍

    一.网络爬虫 网络爬虫又被称为网络蜘蛛(

  • 一篇文章带你搞懂Python类的相关知识

    一.什么是类 类(class),作为代码的父亲,可以说它包裹了很多有趣的函数和方法以及变量,下面我们试着简单创建一个吧. 这样就算创建了我们的第一个类了.大家可以看到这里面有一个self,其实它指的就是类aa的实例.每个类中的函数只要你不是类函数或者静态函数你都得加上这个self,当然你也可以用其他的代替这个self,只不过这是python中的写法,就好比Java 中的this. 二.类的方法 1.静态方法,类方法,普通方法 类一般常用有三种方法,即为static method(静态方法),cl

  • Java中关于Collections集合工具类的详细介绍

    Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变.对集合对象实现同步控制等方法. 排序操作 reverse(List):反转 List 中元素的顺序 shuffle(List):对 List 集合元素进行随机排序 sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 sort(List,Comparator):根据指定的 C

  • linux系统下用户管理相关介绍

    目录 一.用户及用户组存在的意义 1)用户存在的意义 2)用户组存在的意义 二.用户及用户组在系统中存在的方式 三.用户涉及到的系统配置文件 /etc/shadow        用户认证信息文件 四.用户相关操作 1)用户和用户组建立及删除 2)用户和用户组的信息管理 五.用户权力下放 六.文件权限查看和读取 一.用户及用户组存在的意义 1)用户存在的意义 系统的资源是有限的,如何合理分配系统资源? 1.身份 account 2.授权 author 3.认证 auth 以上3个 'a' 称为3

  • Java String类和StringBuffer类的区别介绍

    关于java的字符串处理我们一般使用String类和StringBuffer类 那么String类和StringBuffer类的区别在什么地方呢? 1.String是不可变的.StringBuffer是可变的.在程序中如果定义String s = "this is a string".那么在以后的应用中不能对s进行任何修改只能进行诸如subString等操作,如果想进行改动只能重新new一个string而不是对原来的s进行改动.而对于StringBuffer却是可以改变的,在程序中定义

  • Springcloud Config配置中心使用与相关介绍

    目录 Springcloud Config 什么是springcloud Config config服务端的配置使用 config客户端的相关问题 config客户端的配置使用 动态刷新问题 config客户端的遗留问题 Springcloud Config 什么是springcloud Config   简单来说,Spring Cloud Config就是我们通常意义上的配置中心,也就是微服务项目中,每一个微服务都需要配置相应的配置,如果不同服务的配置文件有相同的配置,如果这些相同配置需要修改

  • Java Calendar日历类的使用介绍

    目录 创建一个Candendar对象 Calendar的常用方法 创建一个Candendar对象 我们都知道创建一个类的对象最简单的方法是从他的构造方法入手,我们看一下它的构造方法. protected Calendar() { this(TimeZone.getDefaultRef(), Locale.getDefault(Category.FORMAT)); this.sharedZone = true; } protected Calendar(TimeZone var1, Locale

随机推荐