網(wǎng)站首頁 編程語言 正文
一、類class
類class是引用類型,可以直接賦值為null,默認值也是null
XClass xClass = null;//語法正確
一般來說,某個類對象使用另一個類的對象賦值時,則兩者共用一個內(nèi)存地址【節(jié)約內(nèi)存空間】,ReferenceEquals引用比較此時返回true
XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
XClass xClass4 = xClass3;
類的構(gòu)造函數(shù)(構(gòu)造方法)
如果一個類沒有顯示定義構(gòu)造函數(shù),則默認有一個無參構(gòu)造函數(shù),
如果一個類已定義了帶參數(shù)的構(gòu)造函數(shù),如果不手動定義無參構(gòu)造函數(shù),則沒有無參構(gòu)造函數(shù)
特殊類String:
特殊類【字符串String】雖然是引用類型,但對字符串的更新并不會修改字符串的原實際值,
字符串作為參數(shù)傳遞并不能篡改原來的值,
可以認為字符串雖然是引用類型,但使用時按值類型處理
二、結(jié)構(gòu)struct
結(jié)構(gòu)struct是值類型,不能直接賦值為null,結(jié)構(gòu)的默認值為0,false,類型名稱字符串等
XStruct xStruct=null;//語法錯誤,不能為值類型賦值為null
如果想為值類型賦值為null,請使用可空類型Nullable<T>
public struct Nullable<T> where T : struct
比如如下代碼即可編譯通過:
Nullable<XStruct> xStruct = null;//可空值類型
或者簡化為
XStruct? xStruct = null;//可空值類型的簡化
? ? 某個結(jié)構(gòu)對象使用另一個結(jié)構(gòu)的對象賦值時,則兩者的內(nèi)存地址完全不同,第二個結(jié)構(gòu)對象新開一個內(nèi)存空間,只不過內(nèi)存的值完全一致【內(nèi)存空間增加】,ReferenceEquals引用比較此時返回false
結(jié)構(gòu)的構(gòu)造函數(shù)
所有結(jié)構(gòu)都自動繼承抽象值類型基類ValueType,有個默認無參構(gòu)造函數(shù)ValueType(),因此無法在自定義結(jié)構(gòu)中定義無參構(gòu)造函數(shù)
using System.Runtime.InteropServices;
using System.Security;
namespace System
{
//
// 摘要:
// 為值類型提供基類。
[ComVisible(true)]
public abstract class ValueType
{
//
// 摘要:
// 初始化 System.ValueType 類的新實例。
protected ValueType();
//
// 摘要:
// 指示此實例與指定對象是否相等。
//
// 參數(shù):
// obj:
// 要與當前實例進行比較的對象。
//
// 返回結(jié)果:
// 如果 true 和該實例具有相同的類型并表示相同的值,則為 obj;否則為 false。
[SecuritySafeCritical]
public override bool Equals(object obj);
//
// 摘要:
// 返回此實例的哈希代碼。
//
// 返回結(jié)果:
// 一個 32 位帶符號整數(shù),它是此實例的哈希代碼。
[SecuritySafeCritical]
public override int GetHashCode();
//
// 摘要:
// 返回此實例的完全限定類型名稱。
//
// 返回結(jié)果:
// 完全限定的類型名稱
public override string ToString();
}
}
值類型重寫了Equals方法,如果一個值類型的具體屬性值完全一致時,兩個對象是相等的
三、測試控制臺應(yīng)用程序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($"結(jié)構(gòu)的默認值為類型名(一定不為null):{default(XStruct)},類型名為【{typeof(XStruct)}】");
Console.WriteLine($"類的默認值為null?【{default(XClass) == null}】");
Console.WriteLine("---------------------------------結(jié)構(gòu)的Equal比較---------------------------------");
XStruct xStruct1 = new XStruct() { Id = 5, Name = "ABC" };
XStruct xStruct2 = new XStruct("ABC") { Id = 5 };
Console.WriteLine($"結(jié)構(gòu)一的內(nèi)容{{Id:{xStruct1.Id},Name:{xStruct1.Name}}}");
Console.WriteLine($"結(jié)構(gòu)二的內(nèi)容{{Id:{xStruct2.Id},Name:{xStruct2.Name}}}");
Console.WriteLine();
Console.WriteLine($"比較兩個結(jié)構(gòu)的實例值是否相等:{xStruct1.Equals(xStruct2)}");
Console.WriteLine($"比較兩個結(jié)構(gòu)的引用是否指向同一個實例:{ReferenceEquals(xStruct1, xStruct2)}");
XStruct xStruct3 = new XStruct("修吾") { Id = 8 };
XStruct xStruct4 = xStruct3;
Console.WriteLine($"結(jié)構(gòu)三的內(nèi)容{{Id:{xStruct3.Id},Name:{xStruct3.Name}}}");
Console.WriteLine($"結(jié)構(gòu)四的內(nèi)容{{Id:{xStruct4.Id},Name:{xStruct4.Name}}}");
Console.WriteLine();
Console.WriteLine($"比較兩個結(jié)構(gòu)的實例值是否相等:{xStruct3.Equals(xStruct4)}");
Console.WriteLine($"比較兩個結(jié)構(gòu)的引用是否指向同一個實例:{ReferenceEquals(xStruct3, xStruct4)}");
Console.WriteLine("---------------------------------類的Equal比較---------------------------------");
XClass xClass1 = new XClass() { Id = 6, Name = "毒瘴泉" };
XClass xClass2 = new XClass("毒瘴泉") { Id = 6 };
Console.WriteLine($"類一的內(nèi)容{{Id:{xClass1.Id},Name:{xClass1.Name}}}");
Console.WriteLine($"類二的內(nèi)容{{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($"類三的內(nèi)容{{Id:{xClass3.Id},Name:{xClass3.Name}}}");
Console.WriteLine($"類四的內(nèi)容{{Id:{xClass4.Id},Name:{xClass4.Name}}}");
Console.WriteLine();
Console.WriteLine($"比較兩個類的實例值是否相等:{xClass3.Equals(xClass4)}");
Console.WriteLine($"比較兩個類的引用是否指向同一個實例:{ReferenceEquals(xClass3, xClass4)}");
Console.ReadLine();
}
}
/// <summary>
/// 測試用的結(jié)構(gòu),結(jié)構(gòu)繼承ValueType,而ValueType重寫了Equals(object obj)方法,因此比較
/// 結(jié)構(gòu)不允許顯式定義無參的構(gòu)造函數(shù),因 結(jié)構(gòu)struct一經(jīng)定義,自動會生成一個無參構(gòu)造函數(shù)
/// </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; }
}
}
四、程序運行如圖:
補充:結(jié)構(gòu)與類的區(qū)別
1.類和結(jié)構(gòu)有以下幾個基本的不同點:
- 類是引用類型,結(jié)構(gòu)是值類型。
- 結(jié)構(gòu)不支持繼承。
- 結(jié)構(gòu)不能聲明默認的構(gòu)造函數(shù)。
- 結(jié)構(gòu)體中聲明的字段無法賦予初值,類可以
- 類的對象是存儲在堆空間中,結(jié)構(gòu)存儲在棧中。
2.選擇使用情況
堆空間大,但訪問速度較慢,??臻g小,訪問速度相對更快。當我們描述一個輕量級對象的時候,結(jié)構(gòu)可提高效率,成本更低。不過假如我們在傳值的時候希望傳遞的是對象的引用地址而不是對象的拷貝,就應(yīng)該使用類了。
總結(jié)
原文鏈接:https://blog.csdn.net/ylq1045/article/details/127648836
相關(guān)推薦
- 2023-01-30 基于redis樂觀鎖實現(xiàn)并發(fā)排隊_Redis
- 2022-09-26 使用JDBC連接數(shù)據(jù)庫執(zhí)行sql語句,創(chuàng)建數(shù)據(jù)庫連接池
- 2022-09-30 docker部署golang?http服務(wù)時端口無法訪問的問題解決_docker
- 2022-11-08 Python?運算符Inplace?與Standard?_python
- 2022-05-04 shell腳本配合zabbix實現(xiàn)tomcat的故障自愈功能_linux shell
- 2022-11-30 Python?Django教程之實現(xiàn)天氣應(yīng)用程序_python
- 2022-07-31 Jenkins定時構(gòu)建語法規(guī)則及時間設(shè)置_相關(guān)技巧
- 2022-03-17 總結(jié)C#處理異常的方式_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支