深入探讨C#中的结构struct

 更新时间:2013年09月30日 14:59:43   作者:  
这篇文章详细介绍了C#中的结构struct,有需要的朋友可以参考一下

一、结构和类的区别

1、结构的级别和类一致,写在命名空间下面,可以定义字段、属性、方法、构造方法也可以通过关键字new创建对象。

2、结构中的字段不能赋初始值。

3、无参数的构造函数无论如何C#编译器都会自动生成,所以不能为结构定义一个无参构造函数。

4、在构造函数中,必须给结构体的所有字段赋值。

5、在构造函数中,为属性赋值,不认为是对字段赋值,因为属性不一定是去操作字段。

6、结构是值类型,在传递结构变量的时候,会将结构对象里的每一个字段复制一份拷贝到新的结构变量的字段中。

7、不能定义自动属性,因为字段属性会生成一个字段,而这个字段必须要求在构造函数中,但我们不知道这个字段叫什么名字。

8、声明结构体对象,可以不使用new关键字,但是这个时候,结构体对象的字段没有初始值,因为没有调用构造函数,构造函数中必须为字段赋值,所以,通过new关键字创建结构体对象,这个对象的字段就有默认值。

9、栈的访问速度快,但空间小,堆的访问速度慢,但空间大,当我们要表示一个轻量级的对象的时候,就定义为结构,以提高速度,根据传至的影响来选择,希望传引用,则定义为类,传拷贝,则定义为结构。

二、Demo

复制代码 代码如下:

struct Point
    {
        public Program p;
        private int x;

        public int X
        {
            get { return x; }
            set { x = value; }
        }
        private int y;

        public int Y
        {
            get { return y; }
            set { y = value; }
        }
        public void Show()
        {
            Console.Write("X={0},Y={1}", this.X, this.Y);
        }
        public Point(int x,int y)
        {
            this.x = x;
            this.y = y;
            this.p = null;
        }
        public Point(int x)
        {
            this.x = x;
            this.y = 11;
            this.p = null;
        }
        public Point(int x, int y, Program p)
        {
            this.x = x;
            this.y = y;
            this.p = p;
        }
    }
    class Program
    {
        public string Name { get; set; }
        static void Main(string[] args)
        {
            //Point p = new Point();
            //p.X = 120;
            //p.Y = 100;
            //Point p1 = p;
            //p1.X = 190;
            //Console.WriteLine(p.X);

            //Point p;
            //p.X = 12;//不赋值就会报错
            //Console.WriteLine(p.X);
            //Point p1 = new Point();
            //Console.WriteLine(p1.X);//此处不赋值不会报错,原因见区别8

            Program p = new Program() { Name="小花"};
            Point point1 = new Point(10, 10, p);
            Point point2 = point1;
            point2.p.Name = "小明";
            Console.WriteLine(point1.p.Name);//结果为小明,分析见下图
        }
    }

相关文章

  • C#中foreach语句深入研究

    C#中foreach语句深入研究

    这篇文章主要介绍了C#中foreach语句深入研究,本文通过手动实现迭代器来了解foreach语句的本质,揭示其原理,需要的朋友可以参考下
    2015-06-06
  • C#小程序15位转18位身份证号代码

    C#小程序15位转18位身份证号代码

    现在我们使用的都是18位身份证号,而以前都是15位身份证号,而如何将15位身份证号转18位身份证号转换为18位身份证号呢?
    2013-02-02
  • C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    这篇文章主要给大家总结介绍了关于C#中如何将MongoDB->RunCommand结果映射到业务类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-04-04
  • Unity UGUI 按钮绑定事件的 4 种方式汇总

    Unity UGUI 按钮绑定事件的 4 种方式汇总

    UGUI 可视化创建以及关联事件很方便, 动态创建可以利用创建好的 Prefab 进行实例化, 只是在关联事件上有些复杂,这篇文章主要介绍了Unity UGUI 按钮绑定事件的 4 种方式,需要的朋友可以参考下
    2022-01-01
  • C# 线程简单介绍及使用详情

    C# 线程简单介绍及使用详情

    这篇文章主要介绍了C# 线程简单介绍及使用详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • C#中sizeof的用法实例分析

    C#中sizeof的用法实例分析

    这篇文章主要介绍了C#中sizeof的用法,包括了常见的用法及注释事项,需要的朋友可以参考下
    2014-09-09
  • c#系列 list详情

    c#系列 list详情

    这篇文章主要介绍了c#系列 list,list 本质是一个数组,。就跟我们操作系统一样,提前申请内存大小。所以我们程序一般都有一个申请内存,实际使用内存,内存碎片这几个概念,下面俩看文章详细内容吧
    2021-10-10
  • 基于Unity Line Renderer组件的常用属性说明

    基于Unity Line Renderer组件的常用属性说明

    这篇文章主要介绍了基于Unity Line Renderer组件的常用属性说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Entity Framework主从表数据加载方式

    Entity Framework主从表数据加载方式

    这篇文章介绍了Entity Framework主从表数据加载方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 一个进程间通讯同步的C#框架引荐

    一个进程间通讯同步的C#框架引荐

    这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下
    2015-07-07

最新评论