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

    类:
    类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
    类有构造和析构函数
    类可以继承和被继承
    结构:
    结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
    结构没有构造函数,但可以添加。结构没有析构函数
    结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

    结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的(以下摘录):
    C#结构体和类的区别问题:在C#编程语言中,类属于引用类型的数据类型,结构体属于值类型的数据类型,这两种数据类型的本质区别主要是各自指向的内存位置不同。传递类的时候,主要表现为是否同时改变了源对象。
    C#结构体和类的区别技术要点:
        ◆类在传递的时候,传递的内容是位于托管内存中的位置,结构体在传递的时候,传递的内容是位于程序堆栈区的内容。当类的传递对象修改时,将同时修改源对象,而结构体的传递对象修改时,不会对源对象产生影响。
        ◆在一个类中,可以定义默认的、不带参数的构造函数,而在结构体中不能定义默认的、不带参数的构造函数。两者都可以定义带有参数的构造函数,通过这些参数给各自的字段赋值或初始化

    代码运行如下:类中赋值以后,两个对象中的值都发生变化,而结构体原来对象的值为发生变化

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        public enum Gender
        { 
            男,
            女
        }
    
        public struct sPerson 
        {
            public string name;
            public int age;
            public Gender sex;
    
            public void say() {
                Console.WriteLine("Hello , my name is {0} , i am {1} years old", this.name,this.age);
            }
    
            public sPerson(string name,int age,Gender sex) {
                this.name = name;
                this.age = age;
                this.sex = sex;
            }
    
            public sPerson() {
                this.name = "default";
                this.age = 0;
                this.sex = Gender.男;  
            }
        }
    
        public class Person
        {
            public string name;
            public int age;
            public Gender sex;
    
            public void say() {
                Console.WriteLine("Hello , my name is {0}, i am {1} years old", this.name,this.age);
            }
    
            public Person(string name,int age,Gender sex) {
                this.name = name;
                this.age = age;
                this.sex = sex;
            }
    
            public Person() {
                this.name = "default";
                this.age = 0;
                this.sex = Gender.男;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                sPerson sp1 = new sPerson("jack", 25, Gender.男);
                sp1.say();
                sPerson sp2 = new sPerson();
                sp2.say();
                Person p1 = new Person();
                p1.say();
                Person p2 = new Person("mick", 30, Gender.男);
                p2.say();
                Console.ReadKey();
            }
        }
    }
  • 相关阅读:
    LeetCode OJ
    LeetCode OJ
    LeetCode OJ
    linux tips
    vim more
    vim basic
    cut
    paste
    uniq
    Linux的用户
  • 原文地址:https://www.cnblogs.com/xiaoliwang/p/9508826.html
Copyright © 2011-2022 走看看