马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#类跟结构的区别

[复制链接]
查看4715 | 回复2 | 2014-11-6 09:32:22 | 显示全部楼层 |阅读模式
第一、引用类型和值类型
类属于引用类型,而结构属于值类型。
结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。

第二、继承性
类可以继承类或者实现接口,而结构只能实现接口,不能继承结构。

第三、实例化
类的实例化需要使用new关键字,但是结构的实例化则可以不使用new关键字。

第四、构造函数
类可以显式地包含无参的构造函数,但是结构却不可以显式地包含无参构造函数,只可以定义带有参数的构造函数。

第五、初始化实例字段
类可以在类的定义中初始化实例字段,但是结构不可以。
在结构声明中,除非字段被声明为 const 或 static,否则无法初始

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 using System.Collections;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassPerson cp = new ClassPerson();
            StructPerson sp = new StructPerson("Mary");
            cp.ShowName();
            sp.ShowName();
            Console.ReadKey();
        }
    }

    //可以继承接口
    public struct StructPerson:IShowName 
    {
        private string name;
        /// <summary>姓名</summary>
        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }

        //可以显式地包含带有参数的构造函数
        public StructPerson(string name)
        {
            this.name = name;
        }

        public void ShowName()
        {
            Console.WriteLine(this.Name);
        }
    }

    //可以继承接口和类
    public class ClassPerson : Creature, IShowName
    {
        //可以在类的定义中初始化实例字段
        private string name="John";
        /// <summary>姓名</summary>
        public string Name
        {
            get
            {
                return this.name;
            }
            set
            {
                this.name = value;
            }
        }

        //可以显式地包含无参的构造函数
        public ClassPerson()
            :base()
        {
        }
        public override void Move()
        {
            Console.WriteLine("Moving");
        }

        public void ShowName()
        {
            Console.WriteLine(this.Name);
        }
    }

    public interface IShowName
    {
        void ShowName();
    }

    public abstract class Creature
    {
        public abstract void Move();
    }
}

最后注意以下几点:
①在结构中初始化实例字段 的方法:一是使用参数化构造函数,二是在声明结构后分别访问成员。 对于任何私有成员或以其他方式设置为不可访问的成员,只能在构造函数中进行初始化。
②当不用new创建结构对象时需要注意,在初始化所有字段之前,字段将保持未赋值状态,同时对象不可用。也就是说,在结构对象包含的所有字段(包含私有的、公有的、隐藏的(自动实现的属性在运行时生成的))初始化之前,该结构对象中的方法或者属性都不可以调用。
③当结构包含引用类型作为成员时,必须显式调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
飞/可爱朋 | 2014-11-6 11:58:24 | 显示全部楼层
881966 | 2018-12-4 21:09:13 | 显示全部楼层
谢谢分享,学习学习
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则