最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Unity或C#項(xiàng)目中避免空引用和數(shù)據(jù)的解決方法

 更新時(shí)間:2025年11月03日 09:12:29   作者:星夜泊客  
在開發(fā)中,我們經(jīng)常會(huì)遇到 UI 需要依賴服務(wù)器數(shù)據(jù)的情況,直接用服務(wù)器返回的數(shù)據(jù),可能會(huì)導(dǎo)致空引用、數(shù)據(jù)格式錯(cuò)誤等問題,為了避免這些問題,本文給大家介紹了如何在 Unity 或 C# 項(xiàng)目中避免空引用和數(shù)據(jù)問題的解決方法,需要的朋友可以參考下

在開發(fā)中,我們經(jīng)常會(huì)遇到 UI 需要依賴服務(wù)器數(shù)據(jù)的情況。直接用服務(wù)器返回的數(shù)據(jù),可能會(huì)導(dǎo)致空引用、數(shù)據(jù)格式錯(cuò)誤等問題。為了避免這些問題,我們可以使用一些設(shè)計(jì)模式,比如 接口、屬性簡(jiǎn)寫屬性表達(dá)式 和 松耦合,并通過 缺省值處理 來保證數(shù)據(jù)安全。

為什么要設(shè)計(jì)接口?

接口就像是一個(gè) 契約,它告訴類“你需要提供哪些功能”。在 UI 設(shè)計(jì)中,接口的作用是:定義必須提供的數(shù)據(jù),而不關(guān)心數(shù)據(jù)的來源或結(jié)構(gòu)。

設(shè)計(jì)接口的目的:

  • 解耦:UI 層只關(guān)心接口,不關(guān)心數(shù)據(jù)的實(shí)現(xiàn)細(xì)節(jié)。這樣即使數(shù)據(jù)格式改變,UI 層的代碼也能不受影響。
  • 保證數(shù)據(jù)可用性:通過接口確保每個(gè)屬性都有一個(gè)有效的值,避免空引用錯(cuò)誤。
  • 統(tǒng)一缺省值處理:如果數(shù)據(jù)缺失,可以通過接口提供統(tǒng)一的缺省值,避免 UI 層重復(fù)編寫空值檢查的邏輯。

接口和屬性的基本設(shè)計(jì)

接口定義了一些數(shù)據(jù)項(xiàng),類通過實(shí)現(xiàn)接口來提供這些數(shù)據(jù)。這里的關(guān)鍵是:接口只定義“我能提供什么”,而不是“怎么提供”。

接口定義示例:

public interface IPlayerViewData
{
    string TitleName { get; }
    string PetName { get; }
    string LevelStr { get; }
}

接口的作用是:告訴 UI “我能拿到這些值”。但是,它并不關(guān)心這些值怎么從服務(wù)器拿到,也不管值可能會(huì)為空,接口只負(fù)責(zé)提供“我能拿到的值”。

實(shí)現(xiàn)接口:傳統(tǒng)寫法 vs 簡(jiǎn)寫屬性

在實(shí)現(xiàn)接口時(shí),傳統(tǒng)寫法和簡(jiǎn)寫表達(dá)式都可以用來提供屬性:

public class PlayerViewData : IPlayerViewData
{
    private PlayerInfo _info;

    public PlayerViewData(PlayerInfo info)
    {
        _info = info; // 構(gòu)造函數(shù)初始化
    }

    // 傳統(tǒng)屬性寫法
    public string TitleName
    {
        get
        {
            if (_info == null || _info.TitleInfo == null)
                return "暫無稱號(hào)";  // 如果數(shù)據(jù)缺失,返回默認(rèn)值
            return _info.TitleInfo.Name;
        }
    }

    // 簡(jiǎn)寫屬性(表達(dá)式主體屬性)
    public string PetName => _info?.PetInfo?.PetName ?? "無寵物";
    public string LevelStr => "Lv." + (_info?.Level ?? 1);
}

簡(jiǎn)寫屬性的優(yōu)勢(shì):

  • 簡(jiǎn)潔:用 => 簡(jiǎn)化了傳統(tǒng)的 get 語法。
  • 易讀:代碼更加清晰,尤其是對(duì)于只讀屬性,直接寫表達(dá)式就行了。

如何處理數(shù)據(jù)缺失?(缺省值和安全訪問)

在實(shí)際項(xiàng)目中,服務(wù)器返回的數(shù)據(jù)有可能為空。接口需要確保即使數(shù)據(jù)缺失,UI 層也能安全顯示。

統(tǒng)一缺省值處理

你可以通過簡(jiǎn)寫屬性來保證數(shù)據(jù)的安全訪問,并在數(shù)據(jù)為空時(shí)提供默認(rèn)值:

public string TitleName => _info?.TitleInfo?.Name ?? "暫無稱號(hào)";
public string PetName => _info?.PetInfo?.PetName ?? "無寵物";
  • ?? 運(yùn)算符提供了缺省值處理,如果數(shù)據(jù)為空(如 TitleInfo 或 PetInfo 為 null),則返回默認(rèn)字符串。

安全訪問集合和可能為空的對(duì)象

為了避免集合為空時(shí)引發(fā)錯(cuò)誤,我們可以使用 FirstOrDefault() 方法,并結(jié)合 ?. 安全訪問:

var attackEntry = attrTables?.FirstOrDefault(t => t.AttName == "攻擊");
  • ?. 確保在 attrTables 為 null 時(shí),不會(huì)拋出空引用異常,而是返回 null。

松耦合:UI 只關(guān)心接口,不關(guān)心數(shù)據(jù)實(shí)現(xiàn)

通過接口,我們可以保證 UI 層不會(huì)直接依賴數(shù)據(jù)結(jié)構(gòu)。UI 層只關(guān)心接口定義的屬性,而不需要知道數(shù)據(jù)是如何獲取的。這就是 松耦合 的實(shí)現(xiàn)。

代碼示例:

// 從服務(wù)器獲取數(shù)據(jù)
PlayerInfo info = GetPlayerInfoFromServer();

// 包裝數(shù)據(jù)到接口
IPlayerViewData data = new PlayerViewData(info);

// UI 層使用接口更新顯示
playerPanel.UpdateUI(data);
  • UI 只依賴接口:UI 層只關(guān)心“我能拿到什么顯示值”,不需要知道數(shù)據(jù)是如何獲取或處理的。
  • UI 安全:即使 TitleInfo 為空,UI 也能正常顯示缺省值 "暫無稱號(hào)"

小結(jié)

概念說明
接口屬性確保 UI 能安全讀取數(shù)據(jù),避免空引用
表達(dá)式屬性 =>簡(jiǎn)潔的屬性寫法,適合只讀屬性
FirstOrDefault + ?.安全訪問集合和可能為空的對(duì)象
松耦合UI 層只關(guān)心接口,不依賴數(shù)據(jù)實(shí)現(xiàn)

記憶口訣:

“接口保證能讀,屬性其實(shí)是函數(shù),缺省值和 ?. 保證安全訪問,UI 只依賴接口,不看內(nèi)部結(jié)構(gòu)”

以上就是在Unity或C#項(xiàng)目中避免空引用和數(shù)據(jù)的解決方法的詳細(xì)內(nèi)容,更多關(guān)于Unity或C#避免空引用和數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用Spire.Doc將HTML轉(zhuǎn)換為文本的代碼實(shí)現(xiàn)

    C#使用Spire.Doc將HTML轉(zhuǎn)換為文本的代碼實(shí)現(xiàn)

    在 .NET 開發(fā)中,將 HTML 轉(zhuǎn)換為純文本是一項(xiàng)常見任務(wù),無論是從網(wǎng)頁中提取內(nèi)容、處理 HTML 郵件,還是生成輕量級(jí)的文本報(bào)告,使用 C# 進(jìn)行 HTML 到文本的轉(zhuǎn)換就顯得尤為重要,本文將介紹如何使用該庫在 C# 中將 HTML 轉(zhuǎn)換為純文本,需要的朋友可以參考下
    2025-10-10
  • DevExpress實(shí)現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法

    DevExpress實(shí)現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法

    這篇文章主要介紹了DevExpress實(shí)現(xiàn)自定義GridControl中按鈕文字內(nèi)容的方法,需要的朋友可以參考下
    2014-08-08
  • C#去除DataTable重復(fù)數(shù)據(jù)的三種方法

    C#去除DataTable重復(fù)數(shù)據(jù)的三種方法

    這篇文章主要介紹了C#去除DataTable重復(fù)數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C#使用Unity實(shí)現(xiàn)剪刀石頭布游戲

    C#使用Unity實(shí)現(xiàn)剪刀石頭布游戲

    這篇文章主要為大家詳細(xì)介紹了C#語言使用Unity實(shí)現(xiàn)剪刀石頭布游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 分享C#操作內(nèi)存讀寫方法的主要實(shí)現(xiàn)代碼

    分享C#操作內(nèi)存讀寫方法的主要實(shí)現(xiàn)代碼

    這篇文章介紹了C#操作內(nèi)存讀寫方法的主要實(shí)現(xiàn)代碼,下面讓我們來看看具體的實(shí)例實(shí)現(xiàn),有需要的朋友可以參考一下
    2013-08-08
  • c#中返回文章發(fā)表的時(shí)間差的示例

    c#中返回文章發(fā)表的時(shí)間差的示例

    現(xiàn)在是2012-12-04 11:29:59,發(fā)表時(shí)間是:2012-12-02 21:29:59,傳統(tǒng)的ts.Days因?yàn)橹禐?天14小時(shí)0分0秒,會(huì)返回“昨天”,而這個(gè)會(huì)返回“前天”
    2012-12-12
  • C#中的char與string詳解

    C#中的char與string詳解

    本文詳細(xì)講解了C#中的char與string,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • WPF開發(fā)txt閱讀器實(shí)現(xiàn)目錄提取功能

    WPF開發(fā)txt閱讀器實(shí)現(xiàn)目錄提取功能

    這篇文章主要為大家詳細(xì)介紹了WPF開發(fā)txt閱讀器時(shí)如何實(shí)現(xiàn)目錄提取功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • C#如何將Excel轉(zhuǎn)換為PDF

    C#如何將Excel轉(zhuǎn)換為PDF

    這篇文章主要介紹了C#如何將Excel轉(zhuǎn)換為PDF問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#通過配置文件動(dòng)態(tài)修改web.config內(nèi)容的操作步驟

    C#通過配置文件動(dòng)態(tài)修改web.config內(nèi)容的操作步驟

    這篇文章主要介紹了C#通過配置文件動(dòng)態(tài)修改web.config內(nèi)容的操作步驟,文中通過圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03

最新評(píng)論

盐山县| 宜都市| 邵武市| 阿拉善右旗| 九龙县| 新和县| 静乐县| 灌云县| 瑞昌市| 会昌县| 四子王旗| 宜阳县| 尼玛县| 彝良县| 新宁县| 瑞金市| 博乐市| 绥江县| 济阳县| 北碚区| 云南省| 绥宁县| 定安县| 壶关县| 神农架林区| 华池县| 葫芦岛市| 金乡县| 大悟县| 陈巴尔虎旗| 五常市| 柘城县| 江口县| 阿瓦提县| 扎鲁特旗| 大田县| 新乐市| 乐亭县| 搜索| 赞皇县| 盐源县|