iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#基础教程之类class与结构struct的区别
  • 746
分享到

C#基础教程之类class与结构struct的区别

c#  class  structc# 类class与结构structc# 类class 2022-11-13 19:11:11 746人浏览 八月长安
摘要

目录一、类class二、结构struct三、测试控制台应用程序GenericTemplateDemo:四、程序运行如图:补充:结构与类的区别总结一、类class 类class是引用类

一、类class

类class是引用类型,可以直接赋值为null,默认值也是null

XClass xClass = null;//语法正确

一般来说,某个类对象使用另一个类的对象赋值时,则两者共用一个内存地址【节约内存空间】,ReferenceEquals引用比较此时返回true

            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
            XClass xClass4 = xClass3;

类的构造函数(构造方法)

如果一个类没有显示定义构造函数,则默认有一个无参构造函数,

如果一个类已定义了带参数的构造函数,如果不手动定义无参构造函数,则没有无参构造函数

特殊类String:

特殊类【字符串String】虽然是引用类型,但对字符串的更新并不会修改字符串的原实际值,

字符串作为参数传递并不能篡改原来的值,

可以认为字符串虽然是引用类型,但使用时按值类型处理

二、结构struct

结构struct是值类型,不能直接赋值为null,结构的默认值为0,false,类型名称字符串等

XStruct xStruct=null;//语法错误,不能为值类型赋值为null

如果想为值类型赋值为null,请使用可空类型Nullable<T>

public struct Nullable<T> where T : struct

比如如下代码即可编译通过:

Nullable<XStruct> xStruct = null;//可空值类型

或者简化为

XStruct? xStruct = null;//可空值类型的简化

    某个结构对象使用另一个结构的对象赋值时,则两者的内存地址完全不同,第二个结构对象新开一个内存空间,只不过内存的值完全一致【内存空间增加】,ReferenceEquals引用比较此时返回false

结构的构造函数

所有结构都自动继承抽象值类型基类ValueType,有个默认无参构造函数ValueType(),因此无法在自定义结构中定义无参构造函数

using System.Runtime.InteropServices;
using System.Security;
 
namespace System
{
    //
    // 摘要:
    //     为值类型提供基类。
    [ComVisible(true)]
    public abstract class ValueType
    {
        //
        // 摘要:
        //     初始化 System.ValueType 类的新实例。
        protected ValueType();
 
        //
        // 摘要:
        //     指示此实例与指定对象是否相等。
        //
        // 参数:
        //   obj:
        //     要与当前实例进行比较的对象。
        //
        // 返回结果:
        //     如果 true 和该实例具有相同的类型并表示相同的值,则为 obj;否则为 false。
        [SecuritySafeCritical]
        public override bool Equals(object obj);
        //
        // 摘要:
        //     返回此实例的哈希代码。
        //
        // 返回结果:
        //     一个 32 位带符号整数,它是此实例的哈希代码。
        [SecuritySafeCritical]
        public override int GetHashCode();
        //
        // 摘要:
        //     返回此实例的完全限定类型名称。
        //
        // 返回结果:
        //     完全限定的类型名称
        public override string ToString();
    }
}

值类型重写了Equals方法,如果一个值类型的具体属性值完全一致时,两个对象是相等的

三、测试控制台应用程序GenericTemplateDemo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace GenericTemplateDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Setwindowsize(120, 30);
            Console.WriteLine($"结构的默认值为类型名(一定不为null):{default(XStruct)},类型名为【{typeof(XStruct)}】");
            Console.WriteLine($"类的默认值为null?【{default(XClass) == null}】");
            Console.WriteLine("---------------------------------结构的Equal比较---------------------------------");
            XStruct xStruct1 = new XStruct() { Id = 5, Name = "ABC" };
            XStruct xStruct2 = new XStruct("ABC") { Id = 5 };
            Console.WriteLine($"结构一的内容{{Id:{xStruct1.Id},Name:{xStruct1.Name}}}");
            Console.WriteLine($"结构二的内容{{Id:{xStruct2.Id},Name:{xStruct2.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct1.Equals(xStruct2)}");
            Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct1, xStruct2)}");
 
            XStruct xStruct3 = new XStruct("修吾") { Id = 8 };
            XStruct xStruct4 = xStruct3;
            Console.WriteLine($"结构三的内容{{Id:{xStruct3.Id},Name:{xStruct3.Name}}}");
            Console.WriteLine($"结构四的内容{{Id:{xStruct4.Id},Name:{xStruct4.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct3.Equals(xStruct4)}");
            Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct3, xStruct4)}");
            Console.WriteLine("---------------------------------类的Equal比较---------------------------------");
            XClass xClass1 = new XClass() { Id = 6, Name = "毒瘴泉" };
            XClass xClass2 = new XClass("毒瘴泉") { Id = 6 };
            Console.WriteLine($"类一的内容{{Id:{xClass1.Id},Name:{xClass1.Name}}}");
            Console.WriteLine($"类二的内容{{Id:{xClass2.Id},Name:{xClass2.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个类的实例值是否相等:{xClass1.Equals(xClass2)}");
            Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass1, xClass2)}");
            Console.WriteLine();
            XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
            XClass xClass4 = xClass3;
            Console.WriteLine($"类三的内容{{Id:{xClass3.Id},Name:{xClass3.Name}}}");
            Console.WriteLine($"类四的内容{{Id:{xClass4.Id},Name:{xClass4.Name}}}");
            Console.WriteLine();
            Console.WriteLine($"比较两个类的实例值是否相等:{xClass3.Equals(xClass4)}");
            Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass3, xClass4)}");
            Console.ReadLine();
        }        
    }
 
    /// <summary>
    /// 测试用的结构,结构继承ValueType,而ValueType重写了Equals(object obj)方法,因此比较
    /// 结构不允许显式定义无参的构造函数,因 结构struct一经定义,自动会生成一个无参构造函数
    /// </summary>
    struct XStruct
    {
        public XStruct(string name)
        {
            Id = 0;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
 
    /// <summary>
    /// 测试用的类
    /// </summary>
    class XClass
    {
        public XClass()
        {
        }
        public XClass(string name)
        {
            Id = 0;
            Name = name;
        }
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

四、程序运行如图:

补充:结构与类的区别

1.类和结构有以下几个基本的不同点:

  • 类是引用类型,结构是值类型。
  • 结构不支持继承。
  • 结构不能声明默认的构造函数。
  • 结构体中声明的字段无法赋予初值,类可以
  • 类的对象是存储在堆空间中,结构存储在栈中。

2.选择使用情况

堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。不过假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。

总结

到此这篇关于C#基础教程之类class与结构struct区别的文章就介绍到这了,更多相关C# 类class与结构struct区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#基础教程之类class与结构struct的区别

本文链接: https://www.lsjlt.com/news/170679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#基础教程之类class与结构struct的区别
    目录一、类class二、结构struct三、测试控制台应用程序GenericTemplateDemo:四、程序运行如图:补充:结构与类的区别总结一、类class 类class是引用类...
    99+
    2022-11-13
    c#  class  struct c# 类class与结构struct c# 类class
  • C#中struct与class的区别详解
    目录1.最大的区别2.struct成员无法被声明为protected。3.struct是隐式的sealed类4.struct中无法重载默认构造函数5.关于对象的初始化6.结构体没有析...
    99+
    2024-04-02
  • C++类和对象之封装及class与struct的区别是什么
    本篇内容主要讲解“C++类和对象之封装及class与struct的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++类和对象之封装及class与struct的区别是什么”吧!封装的意...
    99+
    2023-06-30
  • C++深入探索类和对象之封装及class与struct的区别
    目录封装的意义访问权限class和struct的区别成员属性私有案例练习封装的意义 封装是C++三大面向对象之一 意义: 1、设计类的时候,属性和行为写在一起,表现事物 2、类在设计...
    99+
    2024-04-02
  • C#基础知识之GetType与typeof的区别小结
    在实际开发中经常需要了解具体对象的类型,所以经常会使用GetType()和typeof()、尽管可以得到相应的类型、但两者之间也存在一些差别,接下来我们一起来了解一下吧。 一、Get...
    99+
    2024-04-02
  • C++结构体与类的区别详情
    C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗? 能! ...
    99+
    2024-04-02
  • C++结构体与类的区别有哪些
    这篇文章给大家分享的是有关C++结构体与类的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取...
    99+
    2023-06-25
  • C++深入探索类真正的形态之struct与class
    目录一、类的关键字二、类的真正形态三、小实例四、小结一、类的关键字 struct 在 C 语言中已经有了自己的含义,必须继续兼容在C++ 中提供了新的关键字 class 用于类定义c...
    99+
    2024-04-02
  • C++函数调用与Struct和CLass的区别是什么
    本篇内容介绍了“C++函数调用与Struct和CLass的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、结构回顾结构:自定义的...
    99+
    2023-06-30
  • Python基础教程之控制结构详解
    目录0. 学习目标1. 代码块与缩进2. 条件语句2.1 if 语句2.2 if 语句的嵌套2.3 断言3. 循环3.1 while 循环3.2 for 循环3.3 中断循环4. 控...
    99+
    2024-04-02
  • C++详细讲解函数调用与Struct和CLass的区别
    目录一、结构回顾1、传值调用2、引用调用3、指针调用二、public和private权限修饰符三、类简介四、类的组织一、结构回顾 结构:自定义的数据类型,不管C++/C结构都用Str...
    99+
    2024-04-02
  • 浅谈C结构和C++结构之间的区别
    今天我们来看一下:C结构和C++结构之间,到底有什么不一样地方! 在C++中,struct和class完全相同,除了struct默认为公共可见性和class默认为私有可见性。&nbs...
    99+
    2024-04-02
  • c++中结构和类的区别
    结构和类是c++中的复合数据类型,但存在以下关键区别:默认访问权限(结构为public,类为private)、默认构造函数(类有,结构没有)、成员函数(类有,结构没有)、继承(类支持,结...
    99+
    2024-05-09
    c++
  • C结构和C++结构之间的区别有哪些
    小编给大家分享一下C结构和C++结构之间的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广...
    99+
    2023-06-14
  • python基础之//、/与%的区别详解
    目录示例代码如下:附:一分钟看懂Python中的 // 和 / 和 % 的用法区别总结“ // ” 表示整数除法,返回整数 比如 7/3 结果为2 &ldqu...
    99+
    2024-04-02
  • c++中结构体和类的区别
    c++中的结构体和类之间的区别:默认访问权限:结构体为公开,类为私有。默认构造函数:结构体隐式存在,类没有。成员函数:结构体没有,类可以有。继承:结构体不可继承,类可继承。默认复制:结构...
    99+
    2024-05-10
    c++
  • C#类和结构的区别是什么
    本篇内容主要讲解“C#类和结构的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#类和结构的区别是什么”吧!C#基础知识之密封类可以有虚函数吗?可以,基类中的虚函数将隐式的转化为非虚函...
    99+
    2023-06-18
  • C#基础入门之值类型和引用类型的区别详析
    目录一、值类型和引用类型的区别 1、赋值时的区别 2、内存分配的区别 3、来自继承结构的区别 二、总结 一、值类型和引用类型的区别 .NET的类型可以分为两类:值类型和引用类型。这...
    99+
    2024-04-02
  • 通俗易懂的Redis数据结构基础教程(入门)
    目录stringlisthashsetsortedsetRedis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的...
    99+
    2024-04-02
  • Java基础教程之数组的定义与使用
    目录一.数组的基本概念二.数组的声明三.数组的创建及初始化1.数组的创建2.数组的初始化四.访问数组元素 五.for each 循环 六.数组的拷贝 七.数组排序 八.二维数组 总结...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作