当前位置:首页 > C#学习 > 正文内容

C# 结构体(Struct)

小道6年前 (2018-08-25)C#学习3093

在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。

结构体是用来代表一个记录。

C# 结构的特点

C# 中的结构有以下特点:

结构可带有方法、字段、索引、属性、运算符方法和事件。

结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。

与类不同,结构不能继承其他的结构或类。

结构不能作为其他结构或类的基础结构。

结构可实现一个或多个接口。

结构成员不能指定为 abstract、virtual 或 protected。

当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。

如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

类 vs 结构

类和结构有以下几个基本的不同点:

类是引用类型,结构是值类型。

结构不支持继承。

结构不能声明默认的构造函数。

类与结构体的区别

1、结构体中声明的字段无法赋予初值,类可以:

2、结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制:

类与结构的选择

首先明确,类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。


C# 中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员。

结构和类的区别:

1、结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。

2、结构类型直接存储成员数据,让其他类的数据位于对中,位于栈中的变量保存的是指向堆中数据对象的引用。

C# 中的简单类型,如int、double、bool等都是结构类型。如果需要的话,甚至可以使用结构类型结合运算符运算重载,再为 C# 语言创建出一种新的值类型来。

由于结构是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。

因为结构是值类型,因此在为结构分配内存,或者当结构超出了作用域被删除时,性能会非常好,因为他们将内联或者保存在堆栈中。当把一个结构类型的变量赋值给另一个结构时,对性能的影响取决于结构的大小,如果结构的数据成员非常多而且复杂,就会造成损失,接下来使用一段代码来说明这个问题。

结构和类的适用场合分析:

 1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;

 2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;

3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。

4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。

以上内容节选自 《菜鸟教程

    struct Dog//结构体一般放在类外面。
    {
        private string _name;//定义字段,不能赋初始值,(类中可以)
        private int _age;//定义字段,不能赋初始值,(类中可以)
        public string Name//定义属性
        {
            get{return _name;}
            set{_name = value;}
        }
        public int Age//定义属性
        {
            get{return _age;}
            set{_age = value;}
        }
        public void Sing()//定义方法
        {
            Console.WriteLine("{0}:汪汪.",Name);
        }
        public Dog(string name,int age) //构造函数,结构中不能创建无参构造函数。结构中有默认构造函数,但不能手动创建。
        {
            _name = name;//构造函数 必须给所有字段赋值
            _age = age;//构造函数 必须给所有字段赋值
        }
    }
    class Program
    {
        static Dog d1;//可以不用具体实例化
        static void Main(string[] args)
        {
            d1.Name = "小黑";//给d1.Name赋值
            d1.Age = 8;//给d1.Age赋值
            Dog d =new Dog("小白",10);// 直接新建一个Dog结构,并调用构造函数赋值。
            Console.Write("d结构中的Sing()方法:" );
            d.Sing();//d调用方法
            Console.Write("d1结构中的Sing()方法:");
            d1.Sing();//d1调用方法
            Console.WriteLine("d结构中的Dog名字:{0},年龄:{1}.", d.Name,d.Age);//d输出结果
            Console.WriteLine("d1结构中的Dog名字:{0},年龄:{1}.", d1.Name, d1.Age);//d1输出结果
            Console.ReadKey();
        }
    }

输出结果:

image.png

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://daobk.com/post/65.html

分享给朋友:

“C# 结构体(Struct)” 的相关文章

类型转换Cast和Convert

类型转换Cast和Convert

把源类型赋值给目标类型,两个类型不一致的时候会发生类型转换。a=b,b是源,a是目标。隐式转换、显式转换。当目标类型一定能满足源类型转换过去后的要求的话就是隐式转换;如果当目标类型不一定能满足源类型转换过去后的要求的话就需要显式转换(程序员自己负责)。比如:把中国人转换为人是隐式转换,把人转换为中国...

枚举enum

枚举enum

确定数量、确定值的几个取值:东西南北、男女、上中下。和用字符串比起来,用枚举的好处就是限定了变量的取值范围,程序处理起来更方便。namespace 枚举//命名空间 {     enum xb { 男, 女...

文本框内字符滚动

文本框内字符滚动

页面上有一个文本框,文本框左侧和右侧各有一个按钮,点击左侧按钮文本框中的文字向左循环滚动一次,点击右侧按钮文本框中的文字向右循环滚动一次。        private void button1_Cl...

登录系统

登录系统

登录界面。登录错误三次退出程序,假设用户名、密码是admin、888888,不区分大小写。(易错点:局部变量与类变量)退出程序this.Close()或者Application.Exit()    public partial class&...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。