.NET 中类和结构的区别

1. 值类型与引用类型
  • 结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如int对应System.int32结构。
  • 类是引用类型,引用类型在堆上分配地址。
注解:
  • 对结构变量所做的改变不会影响其的原值,而对于类,改变其变量的值会改变其原值。
  • 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
  • 虽然结构和类的类型不一样,可是他们的基类型都是对象,C#中所有的类型的基类型都是object。
2. 继承性
  • 结构不能从另一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed。
  • 类完全可扩展的,除非显示的声明sealed,否则类可以继承其他类和接口,自身也能被继承。
    注解:虽然结构不能被继承,可是结构能够继承接口,方法和类继承接口一样。
3. 内部结构
  • 结构没有默认的构造函数,但是可以添加构造函数,没有析构函数,没有abstract 和sealed(因为不能被继承),没有protected修饰符,可以不适用new初始化。
  • 类有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。
4. 申明结构用Struct关键字,申明类用class关键字。
code practice:
2789632-e1135507d0686c63.png
code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StructAndClass
{
    class Program
    {
        interface ITestInterface
        {
            void Paint();
        }

        // define a struct
        public struct TestStruct: ITestInterface
        {

            public string Name;
            public int height;
            public bool overWeight()
            {
                return true;
            }
            public void Paint() { }
        }

        // define a class
        public class TestClass: ITestInterface
        {
            public string Name = "Time";
            public void Paint() { }

            ~TestClass()
            {
                Console.WriteLine("Test class destructor.");
            }
        }

        public sealed class ClassExtend: TestClass
        {
            public ClassExtend()
            {
                Console.WriteLine("Test class is extended. However, this class can not be extended.");
            }
        }

        static void Main(string[] args)
        {
            //TestStruct structOne = new TestStruct();
            TestStruct structOne;
            structOne.Name = "Tim";
            structOne.height = 10;

            TestClass classOne = new TestClass();

            // error 
            //TestClass classOne;
            //classOne.Name = "Tim";

            Console.WriteLine("Struct's base class is object: " + ((structOne is object) ? "Yes" : "No"));
            Console.WriteLine("Class's base class is object: " + ((classOne is object) ? "Yes" : "No"));

            ClassExtend classExtend = new ClassExtend();

            structOne.Name = "Tim Changed";
            classOne.Name = "Tim Changed";
            Console.WriteLine("Test to change struct variable,name is changed: " + (structOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + structOne.Name);
            Console.WriteLine("Test to change class variable, name is changed: " + (classOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + classOne.Name);


            Console.ReadKey();
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值