在Unity或C#项目中避免空引用和数据的解决方法

 更新时间:2025年11月03日 09:12:29   作者:星夜泊客  
在开发中,我们经常会遇到 UI 需要依赖服务器数据的情况,直接用服务器返回的数据,可能会导致空引用、数据格式错误等问题,为了避免这些问题,本文给大家介绍了如何在 Unity 或 C# 项目中避免空引用和数据问题的解决方法,需要的朋友可以参考下

在开发中,我们经常会遇到 UI 需要依赖服务器数据的情况。直接用服务器返回的数据,可能会导致空引用、数据格式错误等问题。为了避免这些问题,我们可以使用一些设计模式,比如 接口属性简写属性表达式 和 松耦合,并通过 缺省值处理 来保证数据安全。

为什么要设计接口?

接口就像是一个 契约,它告诉类“你需要提供哪些功能”。在 UI 设计中,接口的作用是:定义必须提供的数据,而不关心数据的来源或结构。

设计接口的目的:

  • 解耦:UI 层只关心接口,不关心数据的实现细节。这样即使数据格式改变,UI 层的代码也能不受影响。
  • 保证数据可用性:通过接口确保每个属性都有一个有效的值,避免空引用错误。
  • 统一缺省值处理:如果数据缺失,可以通过接口提供统一的缺省值,避免 UI 层重复编写空值检查的逻辑。

接口和属性的基本设计

接口定义了一些数据项,类通过实现接口来提供这些数据。这里的关键是:接口只定义“我能提供什么”,而不是“怎么提供”。

接口定义示例:

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

接口的作用是:告诉 UI “我能拿到这些值”。但是,它并不关心这些值怎么从服务器拿到,也不管值可能会为空,接口只负责提供“我能拿到的值”。

实现接口:传统写法 vs 简写属性

在实现接口时,传统写法和简写表达式都可以用来提供属性:

public class PlayerViewData : IPlayerViewData
{
    private PlayerInfo _info;

    public PlayerViewData(PlayerInfo info)
    {
        _info = info; // 构造函数初始化
    }

    // 传统属性写法
    public string TitleName
    {
        get
        {
            if (_info == null || _info.TitleInfo == null)
                return "暂无称号";  // 如果数据缺失,返回默认值
            return _info.TitleInfo.Name;
        }
    }

    // 简写属性(表达式主体属性)
    public string PetName => _info?.PetInfo?.PetName ?? "无宠物";
    public string LevelStr => "Lv." + (_info?.Level ?? 1);
}

简写属性的优势:

  • 简洁:用 => 简化了传统的 get 语法。
  • 易读:代码更加清晰,尤其是对于只读属性,直接写表达式就行了。

如何处理数据缺失?(缺省值和安全访问)

在实际项目中,服务器返回的数据有可能为空。接口需要确保即使数据缺失,UI 层也能安全显示

统一缺省值处理

你可以通过简写属性来保证数据的安全访问,并在数据为空时提供默认值:

public string TitleName => _info?.TitleInfo?.Name ?? "暂无称号";
public string PetName => _info?.PetInfo?.PetName ?? "无宠物";
  • ?? 运算符提供了缺省值处理,如果数据为空(如 TitleInfo 或 PetInfo 为 null),则返回默认字符串。

安全访问集合和可能为空的对象

为了避免集合为空时引发错误,我们可以使用 FirstOrDefault() 方法,并结合 ?. 安全访问:

var attackEntry = attrTables?.FirstOrDefault(t => t.AttName == "攻击");
  • ?. 确保在 attrTables 为 null 时,不会抛出空引用异常,而是返回 null

松耦合:UI 只关心接口,不关心数据实现

通过接口,我们可以保证 UI 层不会直接依赖数据结构。UI 层只关心接口定义的属性,而不需要知道数据是如何获取的。这就是 松耦合 的实现。

代码示例:

// 从服务器获取数据
PlayerInfo info = GetPlayerInfoFromServer();

// 包装数据到接口
IPlayerViewData data = new PlayerViewData(info);

// UI 层使用接口更新显示
playerPanel.UpdateUI(data);
  • UI 只依赖接口:UI 层只关心“我能拿到什么显示值”,不需要知道数据是如何获取或处理的。
  • UI 安全:即使 TitleInfo 为空,UI 也能正常显示缺省值 "暂无称号"

小结

概念说明
接口属性确保 UI 能安全读取数据,避免空引用
表达式属性 =>简洁的属性写法,适合只读属性
FirstOrDefault + ?.安全访问集合和可能为空的对象
松耦合UI 层只关心接口,不依赖数据实现

记忆口诀:

“接口保证能读,属性其实是函数,缺省值和 ?. 保证安全访问,UI 只依赖接口,不看内部结构”

以上就是在Unity或C#项目中避免空引用和数据的解决方法的详细内容,更多关于Unity或C#避免空引用和数据的资料请关注脚本之家其它相关文章!

相关文章

  • C#使用Spire.Doc将HTML转换为文本的代码实现

    C#使用Spire.Doc将HTML转换为文本的代码实现

    在 .NET 开发中,将 HTML 转换为纯文本是一项常见任务,无论是从网页中提取内容、处理 HTML 邮件,还是生成轻量级的文本报告,使用 C# 进行 HTML 到文本的转换就显得尤为重要,本文将介绍如何使用该库在 C# 中将 HTML 转换为纯文本,需要的朋友可以参考下
    2025-10-10
  • DevExpress实现自定义GridControl中按钮文字内容的方法

    DevExpress实现自定义GridControl中按钮文字内容的方法

    这篇文章主要介绍了DevExpress实现自定义GridControl中按钮文字内容的方法,需要的朋友可以参考下
    2014-08-08
  • C#去除DataTable重复数据的三种方法

    C#去除DataTable重复数据的三种方法

    这篇文章主要介绍了C#去除DataTable重复数据的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C#使用Unity实现剪刀石头布游戏

    C#使用Unity实现剪刀石头布游戏

    这篇文章主要为大家详细介绍了C#语言使用Unity实现剪刀石头布游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 分享C#操作内存读写方法的主要实现代码

    分享C#操作内存读写方法的主要实现代码

    这篇文章介绍了C#操作内存读写方法的主要实现代码,下面让我们来看看具体的实例实现,有需要的朋友可以参考一下
    2013-08-08
  • c#中返回文章发表的时间差的示例

    c#中返回文章发表的时间差的示例

    现在是2012-12-04 11:29:59,发表时间是:2012-12-02 21:29:59,传统的ts.Days因为值为1天14小时0分0秒,会返回“昨天”,而这个会返回“前天”
    2012-12-12
  • C#中的char与string详解

    C#中的char与string详解

    本文详细讲解了C#中的char与string,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • WPF开发txt阅读器实现目录提取功能

    WPF开发txt阅读器实现目录提取功能

    这篇文章主要为大家详细介绍了WPF开发txt阅读器时如何实现目录提取功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • C#如何将Excel转换为PDF

    C#如何将Excel转换为PDF

    这篇文章主要介绍了C#如何将Excel转换为PDF问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C#通过配置文件动态修改web.config内容的操作步骤

    C#通过配置文件动态修改web.config内容的操作步骤

    这篇文章主要介绍了C#通过配置文件动态修改web.config内容的操作步骤,文中通过图文结合的方式介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03

最新评论