类和结构是 .NET Framework 中的常规类型系统的两种基本构造。 两者在本质上都属于数据结构。封装着一组总体作为一个逻辑单位的数据和行为。 数据和行为是该类或结构的“成员”,它们包括各自的方法、属性和事件等

对于C/C++程序员来说。结构体和类的差别非常小。仅仅是结构体的默认成员变量为public,类的默认成员变量为private。

可是对于C#来说,结构体和类有非常多的不同。

首先来谈一谈为何须要结构体:

最主要的原因就是结构体有能力去管理、使用不同数据类型的组合。

.NET支持值类型和引用类型的概念,全部的C#内置类型中,除了string外均为值类型。

在C#中,结构体是值类型。类是引用类型。

值类型能够降低对堆的管理、使用。降低垃圾回收,表现出更好的性能。可是值类型也有不好的一面。比方会涉及到装箱拆箱等操作。

以下定义一个结构体:

public struct Foo
{
// Fields
private string fooString;
private int fooNumber;
// Property
public string FooString
{
get
{
return fooString;
}
set
{
fooString = value;
}
}
// Method
public int GetFooNumber()
{
return fooNumber;
}
}

能够看到。结构体和类非常的类似。让我们更深层次的看看两者的不同。

1继承

结构体继承自System.ValueType,而类继承自System.Object。结构体不能继承其它的类或结构体,可是能够把结构体当做是接口。因为接口仅仅是用于引用类型的操作,所以把结构体当成接口就会隐式的发生装箱操作。

比如例如以下代码:

struct Foo : IFoo

{

int x;

}

IFoo iFoo = new Foo();

2构造

C#不同意结构体具有无參数的默认构造函数。原因是:对于值类型,编译器既不会生成默认构造函数。也不会调用默认构造函数。所以你不能这样初始化:

struct MyWrongFoo
{
int x = 1;
}

可是你能够使用new:

Foo foo = new Foo();

这里须要注意的是,虽然使用了new操作,可是结构体分配在栈上,而不是堆上。更有趣的是,new操作没有调用无參数的构造函数。

看看以下的代码:

struct Foo
{
int x;
public Foo(int x)
{
this.x = x;
}
}
class FooTester
{
[STAThread]
static void Main(string[] args)
{
Foo f = new Foo();
}
}

这里我重载了构造函数。就能够使用new了。

所以我们能够这样:

调用 new Foo()

调用重载的构造函数初始化

显示的设置每一个值:

Foo foo;

foo.x = 0;

3析构

我们不能为结构体定义析构函数。

4仅仅读关键字

对于引用类型。readonly关键字阻止你将引用指到其它对象,可是无法阻止你改变该对象的状体。

对于值类型来说。readonly关键字与C++中的const非常像。阻止你改变对象的状态。

class MyReferenceType
{
int state;
public int State
{
get
{
return state;
}
set
{
state = value;
}
}
}
struct MyValueType
{
int state;
public int State
{
get
{
return state;
}
set
{
state = value;
}
}
}
class Program
{
readonly MyReferenceType myReferenceType = new MyReferenceType();
readonly MyValueType myValueType = new MyValueType();
public void SomeMethod()
{
myReferenceType = new MyReferenceType(); // Compiler Error
myReferenceType.State = 1234; // Ok
myValueType = new MyValueType(); // Compiler Error
myValueType.State = 1234; // Compiler Error
}
}

总结:

为结构定义默认(无參数)构造函数是错误的。

在结构体中初始化实例字段也是错误的。

仅仅能通过两种方式初始化结构成员:一是使用參数化构造函数,二是在声明结构后分别訪问成员。 对于不论什么私有成员或以其它方式设置为不可訪问的成员,仅仅能在构造函数中进行初始化。

假设使用 new 运算符创建结构对象。则会创建该结构对象。并调用适当的构造函数。

与类不同,结构的实例化能够不使用 new 运算符。

在此情况下不存在构造函数调用。因而能够提高分配效率。 可是,在初始化全部字段之前,字段将保持未赋值状态且对象不可用。

当结构包括引用类型作为成员时,必须显式调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。 (这将导致编译器错误 CS0171。)

对于结构。不像类那样存在继承。 一个结构不能从还有一个结构或类继承。并且不能作为一个类的基。 可是,结构从基类 Object 继承。

结构可实现接口。其方式同类全然一样。

浅析C#中的结构体和类的更多相关文章

  1. [转]C#中的结构体与类的区别

    C#中的结构体与类的区别   经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字cla ...

  2. C#中的结构体与类的区别

    经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字str ...

  3. C#中的结构体与类的区别 (转载)

    经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字str ...

  4. OpenCV中的结构体、类与Emgu.CV的对应表

    OpenCv中的 C 结构 OpenCV中的 C++ 封装 Emgu.CV中的 C# 封装 OpenCV 和 Emgu.CV 中的结构罗列 谢谢阅读,有误希望指正 原文地址 Basic Structu ...

  5. C C++ 中结构体与类

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...

  6. C++中的结构体

    http://zhidao.baidu.com/link?url=8OYQSKV9mvSBc6Hkf9NsLQmipSge9VCZDJQGAZZs5PCBQ54UTmK98VRmAklEEAFYu7d ...

  7. C/C++中的结构体

    结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.   结构体作用 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成 ...

  8. C语言中的结构体和C++中的结构体以及C++中类的区别

    c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...

  9. (五)羽夏看C语言——结构体与类

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

随机推荐

  1. BZOJ3861 : Tree

    把集合看成左边的点,图中的点看成右边的点,若集合$i$不包含$j$,则连边$i->j$,得到一个二分图,等价于求这个二分图的完备匹配个数. 设$f[i][j]$表示考虑了前$i$个集合,匹配了$ ...

  2. ios真机调试错误解决:Installation of apps is prohibited by a policy on the device

    该问题的出现原因是手机中的访问权限被关闭了,打开方法如下: 设置->通用->访问限制->安装应用程序

  3. react-native ES5与ES6写法对照表

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-es5-and-es6-writing-tabl ...

  4. SharePoint 2019 图文安装教程

    前言 SharePoint 2019刚刚发布,很多群友在寻找安装教程,霖雨正好也下载了进行体验,就把完整的安装过程做成图文教程,分享给大家了,有需要的人可以有个参考. 文章从创建虚拟机开始,可能有点啰 ...

  5. centos下mysql自动备份(亲测可用)

    编写sh脚本如下: #!/bin/bash db_user="root" db_passwd="123456" db_name="test_db&qu ...

  6. jQuery应用一之验证插件validate的使用

    综述 validate是一个用来验证表单提交的插件,应用十分广泛,具有如下的几个功能 自带了基本的验证规则 提供了丰富的验证信息提示功能 多种事件触发验证 自定义验证规则 下面我们就来感受一下这个插件 ...

  7. Html5游戏框架createJS组件--EaselJS

    CreateJS库是一款HTML5游戏开发的引擎,是一套可以构建丰富交互体验的HTML5游戏的开源工具包,旨在降低HTML5项目的开发难度和成本,让开发者以熟悉的方式打造更具现代感的网络交互体验. 掌 ...

  8. 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

  9. Json解析包FastJson使用

    阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser. ...

  10. Shell脚本编程基础笔记一

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8176137.html 一:脚本文件的创建.格式.运行 1:创建shell脚本 首先,要创建一个文件 touch ...