zoukankan      html  css  js  c++  java
  • C#:类和结构的区别

    第一、引用类型和值类型

    类属于引用类型,而结构属于值类型。

    结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。

    第二、继承性

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

    第三、实例化

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

    第四、构造函数

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

    第五、初始化实例字段

    类可以在类的定义中初始化实例字段,但是结构不可以。

    在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。

    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创建结构对象时需要注意,在初始化所有字段之前,字段将保持未赋值状态,同时对象不可用。也就是说,在结构对象包含的所有字段(包含私有的、公有的、隐藏的(自动实现的属性在运行时生成的))初始化之前,该结构对象中的方法或者属性都不可以调用。

    ③当结构包含引用类型作为成员时,必须显式调用该成员的默认构造函数,否则该成员将保持未赋值状态且该结构不可用。

  • 相关阅读:
    2020 HDU校赛 Problem J
    2020 HDU校赛 Problem I
    2020年HDU校赛 Problem A
    HDU 2553 N皇后 (dfs+回溯)
    D
    #6177. 「美团 CodeM 初赛 Round B」送外卖2(floyed + 三进制枚举 )
    E
    B
    大数加法模板(可能有问题,目前没发现)
    H
  • 原文地址:https://www.cnblogs.com/PolarisSky/p/3874318.html
Copyright © 2011-2022 走看看