如何编写更契合Unity的高效代码?

本文探讨了在Unity开发中编写高效C#代码的建议,包括使用属性而非直接访问数据成员,优先选择readonly而非const,推荐使用is/as操作符,利用条件属性,理解和优化Equals与GetHashCode方法,理解短小方法的优势,正确初始化静态成员,通过接口实现多态,以及掌握委托和事件的使用。此外,文章还强调了避免暴露内部类引用和处理基类更新的重要性。
摘要由CSDN通过智能技术生成

本文转自Unity Connect博主 郡墙

在Unity中的 Effectie C# 思想分享

尽可能使用属性(property),而不是直接访问数据成员

  • 属性允许将数据成员作为共有接口的一部分暴露出去,同时仍旧提供面向对象环境下所需的封装。属性这个语言元素可以让你像访问数据成员一样使用,但其底层依旧是使用方法实现的
  • 可以非常轻松的在get和set代码段中加入检查机制
  • 因为属性是用方法实现的,所以它拥有方法所拥有的一切语言特性
  • 属性增加多线程的支持是非常方便的。你可以加强 get 和 set 访问器(accessors)的实现来提供数据访问的同步
  • 属性可以被定义为virtual。
  • 可以把属性扩展为abstract。
  • 可以使用泛型版本的属性类型。
  • 属性也可以定义为接口。
  • 因为实现实现访问的方法get与set是独立的两个方法,在C# 2.0之后,你可以给它们定义不同的访问权限,来更好的控制类成员的可见性
  • 而为了和多维数组保持一致,我们可以创建多维索引器,在不同的维度上使用相同或不同类型。
  • 需要在类型的公有或保护接口中暴露数据

偏向于使用运行时常量(readonly),而不是编译时常量(const)

const

  • 应仅仅在那些性能异常敏感,且常量的值在各个版本之间绝对不会变化时,再使用编译时常量。
  • 编译时常量(const)的值会被目标代码中的值直接取代
  • 仅能用于数值和字符串

readonly

  • 在运行时进行求值。引用运行时生成的IL将引用到readonly变量,而不是变量的值。
  • 可以为任意类型。运行时常量必须在构造函数或初始化器中初始化,因为在构造函数执行后不能再被修改
  • 可以用readonly值保存实例常量,为类的每个实例存放不同的值。而编译时常量就是静态的常量。
  • 有时候你需要让某个值在编译时才确定,就最好是使用运行时常量
  • 标记版本号的值就应该使用运行时常量,因为它的值会随着每个不同版本的发布而改变。
  • const优于readonly的地方仅仅是性能,使用已知的常量值要比访问readonly值略高一点,不过这其中的效率提升,可以说是微乎其微的。

结论
综上,在编译器必须得到确定数值时,一定要使用const。例如特性(attribute)的参数和枚举的定义,还有那些在各个版本发布之间不会变化的值。除此之外的所有情况,都应尽量选择更加灵活的readonly常量。

推荐使用 is 或 as 操作符而不是强制类型转换

as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象

is

  • 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常
  • as运算符对值类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不能编写一段Unity批量下载代码。我是一个自然语言处理模型,没有编写代码的能力。不过,我可以为您提供一些参考资料,希望能帮助您解决问题。 在Unity中,您可以使用UnityWebRequest类实现批量下载文件。以下代码片段演示了如何使用UnityWebRequest下载单个文件: ``` IEnumerator DownloadFile(string url, string savePath) { UnityWebRequest request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if (request.isNetworkError || request.isHttpError) { Debug.Log(request.error); } else { File.WriteAllBytes(savePath, request.downloadHandler.data); Debug.Log("File downloaded successfully"); } } ``` 要批量下载文件,您可以编写一个循环来遍历要下载的文件列表,并在每次迭代中调用DownloadFile函数。例如: ``` string[] downloadUrls = new string[] { "http://example.com/file1", "http://example.com/file2", "http://example.com/file3" }; string saveFolder = Application.persistentDataPath + "/Downloads/"; foreach (string url in downloadUrls) { string fileName = Path.GetFileName(url); string savePath = Path.Combine(saveFolder, fileName); StartCoroutine(DownloadFile(url, savePath)); } ``` 该代码将从downloadUrls中遍历每个URL,并使用DownloadFile函数下载文件。下载的文件将保存在Application.persistentDataPath + "/Downloads/"文件夹中,其中包括下载文件的原始文件名。 请注意,此代码仅为示例代码,您可能需要进行适当的修改以适应您的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值