2023-06-19 Untiy进阶 C#知识补充3——C#1-4主要功能与语法

这篇具有很好参考价值的文章主要介绍了2023-06-19 Untiy进阶 C#知识补充3——C#1-4主要功能与语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


​ 注意:在此仅提及 Unity 开发中会用到的一些功能和特性,对于不适合在 Unity 中使用的内容会忽略。
一、概述
  • C# 1(C# 进阶内容)
    • 委托
    • 事件
  • C# 2(C# 进阶内容)
    • 泛型
    • 匿名方法
    • 迭代器
    • 可空类型
  • C# 3
    • 隐式类型(C# 进阶内容)
    • 对象集合初始化(C# 进阶内容)
    • Lambda 表达式(C# 进阶内容)
    • 匿名类型(C# 进阶内容)
    • 自动实现属性(C# 核心内容)
    • 拓展方法(C# 核心内容)
    • 分部类(C# 核心内容)
  • C# 4
    • 泛型的协变和逆变(C# 进阶内容)
    • 命名和可选参数
    • 动态类型 dynamic
二、命名和可选参数

(一)命名参数

​ 有了命名实参,你将不再需要将实参的顺序与所调用方法的形参列表中的形参顺序相匹配。 每个形参的实参都可按形参名称进行指定。

​ 例如,对于如下函数定义:

public void Test(int i, float f, bool b) { }

​ 可以通过以函数定义的顺序按位置发送实参:

Test(1, 1.2f, true);
Test(f: 3.3f, i: 5, b: false); // 指定命名参数
Test(b: false, f: 3.4f, i: 3); // 任意顺序传参

(二)可选参数

​ 方法、构造函数、索引器或委托的定义可以指定其形参为必需还是可选。任何调用都必须为所有必需的形参提供实参,但可以为可选的形参省略实参。

​ 每个可选形参都有一个默认值作为其定义的一部分。如果没有为该形参发送实参,则使用默认值。 默认值必须是以下类型的表达式之一:

  • 常量表达式;

  • new ValType() 形式的表达式,其中 ValType 是值类型,例如 enum 或 struct;

  • default(ValType) 形式的表达式,其中 ValType 是值类型。

public void Test2(int i , bool b = true, string s = "123") { }

​ 可选参数定义于参数列表的末尾和必需参数之后。 如果调用方为一系列可选形参中的任意一个形参提供了实参,则它必须为前面的所有可选形参提供实参。 实参列表中不支持使用逗号分隔的间隔。例如,在以下代码中,使用一个必选形参和两个可选形参定义实例方法。

Test2(1);              // 正确,等价于 Test2(1, true, "123");
Test2(1, , "234");     // 错误
Test2(1, true, "234"); // 正确

(三)结合使用

​ 如果知道第三个形参的名称,则可以使用命名实参来完成此任务:

Test2(1, s: "234");

(四)代码示例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson3 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // 有了命名参数,我们将不用匹配参数在所调用方法中的顺序
        // 每个参数可以按照参数名字进行指定
        Test(1, 1.2f, true);
        Test(f: 3.3f, i: 5, b: false);
        Test(b: false, f: 3.4f, i: 3);

        // 命名参数可以配合可选参数使用,让我们做到跳过其中的默认参数直接赋值后面的默认参数
        Test2(1, true, "234");
        Test2(1, s: "234");
    }

    public void Test(int i, float f, bool b) { }

    public void Test2(int i , bool b = true, string s = "123") { }
}
三、动态类型 dynamic
  • 通过 dynamic 类型标识变量的使用和对其成员的引用绕过编译时类型检查,改为在运行时解析这些操作。
  • 在大多数情况下,dynamic 类型和 object 类型行为类似,任何非 Null 表达式都可以转换为 dynamic 类型。
  • dynamic 类型和 object 类型不同之处在于:
    • 编译器不会对包含类型 dynamic 的表达式的操作进行解析或类型检查,编译器将有关该操作信息打包在一起,之后这些信息会用于在运行时评估操作。
    • 在此过程中,dynamic 类型的变量会编译为 object 类型的变量。因此,dynamic 类型只在编译时存在,在运行时则不存在。

注意:

  1. 使用 dynamic 功能需要将 Unity 的 .Net API 兼容级别切换为 .Net 4.x。
  2. IL2CPP 不支持 C# dynamic 关键字。它需要 JIT 编译,而 IL2CPP 无法实现。
  3. 动态类型是无法自动补全方法的,在书写时要保证方法的拼写正确性。
    该功能只做了解,不建议使用

代码示例:文章来源地址https://www.toymoban.com/news/detail-496819.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test1
{
    public void TestTest() { }
}

public class Lesson3 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        dynamic dyn = 1;
        object obj = 2;

        dyn += 2;

        print(obj.GetType()); // System.Int32
        print(dyn.GetType()); // System.Int32
        print(dyn);           // 3

        object t = new Test1();
        dynamic tmp = t; // 直接赋值
        tmp.TestTest();  // 只要能够确定对象内容,直接调用其方法即可
    }
}

到了这里,关于2023-06-19 Untiy进阶 C#知识补充3——C#1-4主要功能与语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#进阶-实现邮箱收发功能

    在C#中,发送邮件是一项常见的任务,通常用于实现自动化通知、报警和与用户进行交互等场景。C#提供了多种发送邮件的方式,主要方式包括SMTP协议、POP3协议、IMAP协议、Exchange服务器等。使用这些方式,开发人员可以灵活地发送和接收邮件,满足各种应用场景的需求。 下表

    2024年04月15日
    浏览(26)
  • 【unity之c#专题篇】——进阶知识实践练习

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unityc#专题篇习题 ⭐【Unityc#专题篇】之c#核心篇】 ⭐【Unityc#专题篇】之c#基础篇】 ⭐【Unity-c#专题篇】之c#入门篇) ⭐【Unityc#专题篇】

    2024年02月07日
    浏览(37)
  • 【Linux基础】Linux主要指令的详解(指令补充)

    语法: cp [选项] 源文件或目录 目标文件或目录 功能: 复制文件或目录 说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的

    2024年02月03日
    浏览(34)
  • C#学习笔记--数据结构、泛型、委托事件等进阶知识点

    ArrayList 元素类型以Object类型存储,支持增删查改的数组容器。 因而存在装箱拆箱操作,谨慎使用。 ArrayList和数组区别? ArrayList使用不用说明固定长度,数组则需要 数组存储的是指定类型的,ArrayList是Object ArrayList存在装箱拆箱,数组不存在 ArrayList数组长度用Count获取 而数组

    2024年02月08日
    浏览(43)
  • 是否应该学习Qt作为主要编程语言C/C++的补充?

    如果您以C/C++作为主要编程语言,学习Qt是一个不错的选择。主要还是学习Qt的思想。 在初期阶段,您可以学习如何使用Qt设计界面。您可以使用Qt Designer拖拽控件,这样做比较直观。当然,您也可以手写代码实现界面。 Qt目前主要提供了两种UI实现方式:Widget和Qt Quick。 Widge

    2024年02月07日
    浏览(53)
  • 2023年,软件测试趋于饱和,如何从功能测试进阶到自动化测试?

    功能测试转成自动化测试,答案就三个字:“ 靠学习 ”。 学习自动化的方法无非是三种: 一、靠培训 在相对有氛围的学习环境中来学习自动化测试,这是一个较快学习的方法。 二、靠自学自动化教程(下方有视频资源推荐) 如果在职,不能全职学习,可以找一些自动化学

    2024年02月11日
    浏览(52)
  • 后悔没早学这份Python神级文档!2023最新入门到进阶核心知识点学习文档!

    如今学 Python 的程序员越来越多,甚至不少人会把 Python 当作第一语言来学习。不过尽管 Python 功能强大上手轻松,但并不代表它的学习曲线不陡峭,得来全不费工夫。 当推开 Python 的大门,你会发现 Python 入门简单但精通很难。看似语法记得滚瓜烂熟,但一进入实际项目,就

    2024年02月06日
    浏览(43)
  • 【运维知识进阶篇】zabbix5.0稳定版详解7(zabbix分布式监控:使用场景+功能详解+快速部署+基本使用)

    如果你有几百上千台客户端的数据需要上报给zabbix服务端,即便是你做了主动注册,监控项目主动式,那服务端压力还是会很大,所以我们可以考虑zabbix分布式监控。 zabbix proxy可以代替zabbix server收集性能和可用性数据,然后把数据汇报给zabbix server,并且在一定程序分担zab

    2024年02月11日
    浏览(51)
  • Autosar诊断实战系列16-UDS19 06扩展数据配置及工程问题讨论

    在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与BswM/NvM关联模块的应用开发及诊断capl测试脚本开发等诊断相关实战内容。 Autosar诊断实战导读快速链接:

    2024年02月09日
    浏览(37)
  • [ WXML 文件编译错误] (env: macOS,mp,1.06.2206090; lib: 2.19.4)

    微信小程序中,通过app.json文件创建一个页面demo,然后开始报错 [ WXML 文件编译错误] (env: macOS,mp,1.06.2206090; lib: 2.19.4) 提示的是文件编译错误,然后各种百度都没有查到这个问题。根据提示,应该是该文件中的代码出现错误,导致编译出现问题,但只加入一行,没有动其他的地

    2024年02月12日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包