美文网首页
.NET 中类和结构的区别

.NET 中类和结构的区别

作者: 张中华 | 来源:发表于2018-11-19 21:03 被阅读58次

1. 值类型与引用类型

  • 结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如int对应System.int32结构。
  • 类是引用类型,引用类型在堆上分配地址。
注解:
  • 对结构变量所做的改变不会影响其的原值,而对于类,改变其变量的值会改变其原值。
  • 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
  • 虽然结构和类的类型不一样,可是他们的基类型都是对象,C#中所有的类型的基类型都是object。

2. 继承性

  • 结构不能从另一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed。
  • 类完全可扩展的,除非显示的声明sealed,否则类可以继承其他类和接口,自身也能被继承。
    注解:虽然结构不能被继承,可是结构能够继承接口,方法和类继承接口一样。

3. 内部结构

  • 结构没有默认的构造函数,但是可以添加构造函数,没有析构函数,没有abstract 和sealed(因为不能被继承),没有protected修饰符,可以不适用new初始化。
  • 类有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。

4. 申明结构用Struct关键字,申明类用class关键字。

code practice:

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();
        }
    }
}

相关文章

  • .NET 中类和结构的区别

    1. 值类型与引用类型 结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如int对应System...

  • C#问题整理

    1, .NET 中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多。结构不能申明有默认...

  • 深入探讨C#中的结构struct

    (引用:http://www.jb51.net/article/41820.htm) 一、结构和类的区别 1、结构...

  • 第九章 类和结构体

    c++中,结构体是稍有不同的类,类能做的,结构体也可以; 而swift中,结构体与类有较大区别, 结构体与类的区别...

  • Swift 中结构体和类

    swift 中类和结构体的区别结构和类结构和类是通用的,灵活的结构,它们成为程序代码的构建块。您可以定义属性和方法...

  • 结构体和类的一些简单区别

    结构体和类的区别 1.写法区别: 结构体-struct 类-cl...

  • iOS知识点-8.类(class)和结构体(struct)有什么

    Swift Basics 类(class)和结构体(struct)有什么区别? Swift中,类是引用类型,结构体...

  • 一些问题(一)

    1. 类(class)和结构体(struct)有什么区别? 在 Swift 中,类是引用类型,结构体是值类型。值类...

  • 结构体专题

    结构体变量和结构体指针的区别[https://blog.csdn.net/taolaodawho/article/...

  • Swift - 学习

    1.类和结构体的区别 Swift中结构体和类的比较 2.写时拷贝机制 Swift Copy-On-Write 写时...

网友评论

      本文标题:.NET 中类和结构的区别

      本文链接:https://www.haomeiwen.com/subject/aonafqtx.html