类与结构那点事

有时候总是分不清类和结构,在什么时候用类?在什么时候用结构?

  • 按值区分

类,引用类型

结构,值类型

  • 定义方式

类:字段(除了const字段之外)应总是私有的,并 由公有属性封装;

1 ResponseCassetteCounter cassetteCounter = new ResponseCassetteCounter();

结构:结构即可以像类一样用过new运算符,但并未为结构分配堆中的内存;声明后还可以直接对字段赋值; 编译器总是提供一个无参数的默认构造函数,它是不允许替换的;结构不支持实现继承,但支持接口继承;

1 Dimensions point = new Dimensions();
2 point.Length = 3;
3 point.width = 6;
1 Dimensions point;
2 point.Length = 3;
3 point.Width = 6;

如果类用第二种方式定义的话会产生编译错误, 因为point包含一个未初始化的引用;

  • 性能

类存储在堆中,通过这种方式可以在数据的生存期上获得很大的灵活性,但性能会有一定的损失,因为托管堆的优化,这种性能损失比较小;有时仅需要一个小的数据结构。 此时,类提供的功能多于我们需要的功能,由于性能
原因,最好使用结构。对于分配内存来说,结构是要比类快的,但是把结构作为参数来传递或者把一个结构赋予另一个结构(如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用 。 这
样就会有性能损失,根据结构的大小,性能损失也不同;

当把结构作为参数传递给方法时,应 把它作为ref参数传递,以避免性能损失;此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度工样快了;

  • 构造函数

禁止在C#的结构内使用无参数的构造函数,默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,且总是隐式地给出,即使提供了其他带参数的构造函数,也是如此。提供字段的初始值也不能绕过默认构造
函数,例如下面的代码编译时不能通过的

1 struct Dimensions
2 {
3     pub1ic double Length = 1; // error. Initial values not allowed
4     pub1ic double Width = 2;// error. Initial values not allowed
5 }

当然,如果Dimensions声明为一个类,这段代码就不会有编译错误;

时间: 2024-10-11 12:35:24

类与结构那点事的相关文章

Java类的结构及使用

类的结构: 属性(对象数据的描述),方法(对象的行为,也就是对象可以做的事),构造的方法(用于实例化对象),内部类(即在类体中声明的类),块(分为静态块和实例块) 类的作用:类就是一个模板,定义多个对象共同的属性和方法. 类的声明形式: [访问权限修饰符]  [修饰符] class类名 {  } 访问权限修饰符:有两种,Public,defult 需要注意的是:在该形式中,访问权限修饰符和修饰符这两个是可以省略不写的. 属性的定义: 属性即对象的数据 属性的声明方式: [访问权限修饰符]  [修

C#类和结构的关系

主要联系:类和结构都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法.类定义了每个类对象(实例)可以包含什么数据和功能.例如,如果一个类表示一个顾客,就可以定义字段CustomerID.FirstName.LastName和Address,包含该顾客的信息.还可以定义处理存储在这些字段中的数据的功能.接着就可以实例化这个类的对象,以表示某个顾客,并为这个实例设置这些字段,使用其功能. class PhoneCustomer { public const string DayOf

进击的雨燕-------------类和结构体

类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和结构体定义属性(常量.变量)和添加方法,从而扩展类和结构体的功能. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意通常一个类的实例被称为对象.然而在 Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我

C#:类和结构的区别

第一.引用类型和值类型 类属于引用类型,而结构属于值类型. 结构在赋值时进行复制. 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据. 第二.继承性 类可以继承类或者实现接口,而结构只能实现接口,不能继承结构. 第三.实例化 类的实例化需要使用new关键字,但是结构的实例化则可以不使用new关键字. 第四.构造函数 类可以显式地包含无参的构造函数,但是结构却不可以显式地包含无参构造函数,只可以定义带有参数的构造函数. 第五.初始化实例字段 类可以在类的定义中

【Swift】学习笔记(八)——类和结构体

1.类和结构体的定义 <pre name="code" class="html">struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? //值为可选String类型的name } 类:keyw

C#类与结构再次详解

类和结构是 .NET Framework 中的常规类型系统的两种基本构造.  两者在本质上都属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为.  数据和行为是该类或结构的"成员",它们包含各自的方法.属性和事件等(本主题后面列出了这些内容). 类或结构的声明类似于蓝图,用于在运行时创建实例或对象.  如果定义一个名为 Person 的类或结构,则 Person 为类型名称.  如果声明并初始化 Person 类型的变量 p,则 p 称为 Person 的对象或实例.  可以创建

swift基础学习(04)[闭包、函数、枚举、类和结构体]

//闭包表达式:闭包表达式是一种利用简洁语法构建内联闭包的方式 //sort方法:排序功能,排序后的原来的不会被修改 //:从大到小排序 let names = ["d","ds","wa","ad"] func sortNames(sName1:String,sName2:String) -> Bool { return sName1 > sName2 } var result = names.sort(sort

swift——类和结构体对比

Swift 中类和结构体有很多共同点.共同处在于: ?       定义属性用于储存值 ?       定义方法用于提供功能 ?       定义下标用于通过下标语法访问值 ?       定义初始化器用于生成初始化值 ?       通过扩展以增加默认实现的功能 ?       符合协议以对某类提供标准功能 更多信息请参见属性,方法,下标,初始过程,扩展,和协议. 与结构体相比,类还有如下的附加功能: ?       继承允许一个类继承另一个类的特征 ?       类型转换允许在运行时检查和

C# 类与结构

类 1.类的访问修饰符:public(所有可访问) internal(在一个程序集中可访问) protected(本类及继承类可访问) private()(本类可访问) 2.类的构造器:(1)非静态构造器(2)静态构造器 (1)非静态构造器:有访问修饰符,如果是private ,则表示该类不允许被实例化(因为该构造器只允许类内部访问) (2)静态构造器:  无访问修饰符,默认是public也只能是public,静态构造器只能有一个 3.常量(const)与只读字段(readonly): (1)常