高级C#技术(二)

前言

本章为高级C#技术的第二节也是最后一节。前一节在下面这个链接

高级C#技术icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/134930989?spm=1001.2014.3001.5501

匿名类型

匿名类型如其名,匿名的没有指定变量的具体类型。

举个例子:

1 创建一个类

    public class Student{public int Age { get; set; }public int Weight { get; set; }public string Name { get; set; }}

2 创建一个Student的实例化,并且将这个类的所有成员进行了一个初始化

 Student student = new Student{Age = 10,Weight = 100,Name = "",};

示例解释:当前代码的写法是上一节提到的对象初始化器。

创建一个匿名类型:

var Variable = new
{Age = 10,Weight = 100,Name = "",
};

示例解释:

        1 使用了var 关键字 ,因为匿名函数没有可以使用的标识符(类型)
        2 new 关键字后没有举明具体类型,等于是告诉编译器我们需要使用匿名类型
        3 在系统的智能提示中,我们鼠标放在变量类型上都会显示相应的变量类型。 而匿名类型则是用a来表示。       

图例:

注意:当前匿名类型不是创建了Student的实例,而是一个自定义的匿名类型两者没有关系。

使用匿名类型:

var s = Variable.Age;//可以通过创建的匿名类型,拿到匿名类型的成员,但这些数据是只读的

注意:可以通过创建的匿名类型,拿到匿名类型的成员,但这些数据是只读的 

扩展(此处引入书上源码)

var animals = new[]
{new { Name = "Benjamin", Age = 42, Weight = 185 },new { Name = "Benjamin", Age = 42, Weight = 185 },new { Name = "Andrea", Age = 46, Weight = 109 }
};
WriteLine(animals[0].ToString());
WriteLine(animals[0].GetHashCode());
WriteLine(animals[1].GetHashCode());
WriteLine(animals[2].GetHashCode());
WriteLine(animals[0].Equals(animals[1]));
WriteLine(animals[0].Equals(animals[2]));
WriteLine(animals[0] == animals[1]);
WriteLine(animals[0] == animals[2]);
ReadKey();

示例解释:

        当前的var animals=new [] 这里是使用了我们前面的类型推理,在当前这个匿名类型对象数组当中,我们创建了多个匿名类型。然后调用了几种不同的方法后输出结果。

        GetHashCode:返回一个对象的哈希码(整数数值)可以用于储存在哈希表等数据结构中。在数组当中的前两个有着相同的属性值,即返回的哈希值是相同的。

        Equals:匿名函数上就是比较一个对象的每个属性与另一个的对应属性值是否相同。如果相同则返回true。

        ==:比较比较对象引用。与方法Equals一致,但在匿名函数中的Equals不是一致。     

输出结果:

{ Name = Benjamin, Age = 42, Weight = 185 }
-1144474565
-1144474565
-977821549
True
False
False
False

提问:创建匿名类型时,如果是是多个相同类型的参数,会创建多个匿名类型吗?像我们前面扩展中创建的方式。


答:不会,会创建同一个匿名类型的多个实例。

动态查找

        动态查找:1 希望使用C#处理另一种语言创建的对象。2 处理未知类型的C#对象,如前一章使用了简单的反射来访问与类型关联的特性。

动态类型

动态类型我不好解释我们直接看它的定义方式,以及使用方式。

定义 (关键字dynamic)  :

public dynamic dongtaitype;

注意:        

        上述代码我们就已经定义了一个动态类型,但它与我们前面的var关键字不同var的关键字它并不是一个类型,而我们这里定义的'dongtaitype'它叫动态类型。一旦有了动态类型我们就可以继续访问其他成员。 

namespace MY
{class Program{public static dynamic dongtaitype;static void Main(){dongtaitype.ToString();}}
}

示例解释:我们这里直接用当前我们创建的动态类型直接调用了ToString方法。


注意:

        我这里并没有实现ToString方法也并没有给我们的动态类型进行一个初始化。所以它现在的值是"null" 。但编译器并不会报错。编译器还是会在运行的时候去调用这个方法,但当前变量是null所以这无法调用,编译器会抛出异常。


警告:我们在使用动态类型的情况下,我们尽量在只能使用动态类型的情况下再去使用它。如非.net对象,我的理解就是非C#语言创建的对象

接下来我大家看一个动态类型的例子(引在书上示例):

using Microsoft.CSharp.RuntimeBinder;
using static System.Console;
namespace My
{class MyClass1{public int Add(int var1, int var2) => var1 + var2;}class MyClass2 { }class Program{static int callCount = 0;static dynamic GetValue(){if (callCount++ == 0){return new MyClass1();}return new MyClass2();}static void Main(string[] args){try{dynamic firstResult = GetValue();dynamic secondResult = GetValue();WriteLine($"firstResult is: {firstResult.ToString()}");WriteLine($"secondResult is: {secondResult.ToString()}");WriteLine($"firstResult call: {firstResult.Add(2, 3)}");WriteLine($"secondResult call: {secondResult.Add(2, 3)}");}catch (RuntimeBinderException ex){WriteLine(ex.Message);}ReadKey();}}
}

示例解释:

        当前我们定义了两个类一个是MyClass1 一个是MyClass2 。其中MyClass1 当中我们定义了一个Add的一个方法。MyClass2 我们没有定义任何成员。在程序主入口Main函数当中我们定义了两个动态类型并且调用了返回动态类型的方法。那么在我们第一次调用GetValue这个方法的时候它会为我们返回一个MyClass1 的实例。在我们第二次调用的时候会返回一个MyClass2 的实例。随后我们使用我们拿到的动态类型去调用我们的ToString方法在这个我们是可以调用的,它实际是一个类型的实例化,当然也可以调用我们父类的ToString方法。那么重要的是我们输出语句的第三个输出语句,我们调用了一个Add的方法我们当前第一个动态类型是没有问题。但是下面那个MyClass2 的实例。这个动态类型它是无法调用因为它根本就没有当前方法。所以这里我们会抛出一个异常会提示“My.MyClass2”未包含“Add”的定义。 然后我们再对抛出的异常进行一个打印异常消息随后这个代码就结束了 

 高级方法参数

高级方法参数:允许使用命名参数和可选参数对方法的一个使用和定义

可选参数

定义方法时某些参数是可选的,而并非像常见方法的参数,要进行重载才能实现相同效果。

示例:

using System;
using Microsoft.CSharp.RuntimeBinder;
using static System.Console;
namespace My
{class Program{static void Main(string[] args){WStudent("zhangsan", 15);WStudent("李四");ReadKey();}#region 重载实现static void WrileStudent(string str){WriteLine(str);}static void WrileStudent(string str, int age){WriteLine(str + age);}#endregion#region 可选参数static void WStudent(string str, int age = 0){WriteLine(str + age);}#endregion}
}

示例解释:

        当前我们给”WrileStudent“方法提供了两个重载的方法。当然我们在下面又定义了一个效果相同的一个方法。其中int age=0 我们在这里其实就是定义了一个可选参数。我们在需要使用它的时候则给它传值,不需要可以直接忽略不传。

1 可选参数的值:默认值必须是:字面值、常量值、默认值类型值。

2 Optional特性:我们也可以使用当前特性定义可选参数

  static void WStudent(string str, [Optional] string ll, int age = 0){WriteLine(str + age+ ll);}

3 可选参数的顺序 :

  • 可选参数必须位于方法参数列表的末尾
  • 没有默认值的参数不能放在有默认值参数的后面 

命名参数

  //使用static void Main(string[] args){WStudent("李四", age: 10, ll: "");ReadKey();}//定义static void WStudent(string str, [Optional] string ll, int age = 0,int A=0,int B=10){WriteLine(str + age + ll);}

注意:使用方式时参数名+":"+值。


提示: 

        1 使用命令参数时可以指定需要的任意多个参数,而且参数的顺序是任意的。

        2 命名参数也是可选的 

        3 当方法签名中有多个可选参数和一些必选参数时,可以先指定必选参数,然后再指定需要使用到的可选参数。

Lambda表达式

         Lambda表达式是一种结构,简化C#编程的某些方面。Lambda表达式与其他的C#语言特性结合起来使用及其有用。如和匿名方法结合使用。

提示:匿名方法中 我们不要使用:My.lapsed+=Wrile; 这里是直接将一个方法赋值给事件。这样做会使代码更难理解也不清楚会发生什么  

把lambda表达式用于匿名方法

        在前面我们介绍了匿名方法的使用这里我将演示用lambda表达式替换匿名方法。在使用之前我有必要和你介绍lambda表达式的组成成分,分为三步。

第一部分:在括号当中放参数列表

第二部分:运算符

第三部分:我们的C#语句

举个例子:

using System;
using System.Timers;
namespace My
{class Program{static void Main(string[] args){Timer timer=new Timer(100);timer.Elapsed += delegate (object sender, ElapsedEventArgs e){//事件处理代码};//lambda 表达式替换匿名函数timer.Elapsed += (sender, e) => Console.Write("Hello");}}
}

示例解释:

        当前我们就做了一个lambda表达式替换匿名函数的一个示例。其中括号当中的就是我们的参数列表其他的部分也是按照我们上面所提到的三个部分所组成我们一个完整的lambda表达式 

Lambda表达式的参数

        Lambda表达式使用类型推理功能来确定所传递的参数类型。我们上述的一个示例并没有指定类型的情况下我们就是使用的它的一个类型推理功能,一个称为隐式类型化的Lambda表达式但如果我们指定了参数列表,当中的参数类型。那么它就被称为一个显示的Lambda表达式 

举个例子:

//显式lambda 表达式
timer.Elapsed += (object sender, ElapsedEventArgs e) => Console.Write("Hello");
//隐式lambda 表达式
timer.Elapsed += (sender, e) => Console.Write("Hello");

注意:

        1 在表达式当中你要么就全部显式类型要么就全部隐式类型。不能一个显式类型一个隐式类型 

        2 定义没有参数的 Lambda 表达式 则使用空括号来表达

举个例子:(sender) => Console.Write("Hello");

        3 定义单个参数的 Lambda 表达式 则不需要用括号  sender => Console.Write("Hello");

Lambda表达式的语句体

        我们其实可以在表达式的语句体中包含多个语句,为此我们就可以用花括号将我们的代码块放在其中。

举个例子:

timer.Elapsed += (object sender, ElapsedEventArgs e)=>
{ //放入代码块
};

        当我们lambda表达式 需要返回除void类型的其他类型,那么我们就要用上关键字 return 进行返回值,和我们在方法中一样。

提示(引入书上原文):如果需要多个语句则定义一个单独的非并匿名方法来代替lambda表达式比较好。

Lambda表达式用作委托和表达式树

        Lambda表达式其实是一个委托,你可以把Lambda表达式赋值给一个委托类型的变量。如我们前面的几个示例一样。但是在system名称空间中已经为我们提供了一些委托类型。所以在很多情况下我们都可以使用这些泛型委托类型而不必定义自己的泛型委托类型。

举例:

泛型类型参数列表个数返回类型
Action表示Lambda表达式     不带参数Void
Action<>表示Lambda表达式最多八个参数Void
Func<>表示Lambda表达式最多八个参数不是Void

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot运维中的高级配置

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

2023年【烟花爆竹经营单位主要负责人】免费试题及烟花爆竹经营单位主要负责人模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 烟花爆竹经营单位主要负责人免费试题参考答案及烟花爆竹经营单位主要负责人考试试题解析是安全生产模拟考试一点通题库老师及烟花爆竹经营单位主要负责人操作证已考过的学员汇总&#xff0c;相对有效帮助烟花爆竹经营…

vscode报错:建立连接:XHR failed

文章目录 问题解决方案 问题 Windows端ssh远程连接Linux端&#xff0c;Windows端vscode报错&#xff1a;“…XHR failed.” 解决方案 参考&#xff1a;解决 Windows 端 VS Code “无法与 “…“ 建立连接&#xff1a;XHR failed.” 问题 亲测有效。 总结&#xff1a; linux…

TreeSelect 树型选择控件 编辑回显时所选的值与展开后的数据不对应 解决方案

一、业务场景&#xff1a; 最近在使用Vue框架和antd-vue组件库的时候&#xff0c;发现在做编辑回显时** TreeSelect 树型选择控件** 组件的选中的值能拿到&#xff0c;但是在下拉列表的回显位置有偏差。为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、bug信息…

基于ssm毕业生就业管理平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业生就业管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

Mesh里面的MFB是什么文件,工程重置了能否还原?

答&#xff1a;模方工程重置了以后&#xff0c;如果有备份可以还原。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持一键自动提取房屋结构&am…

JVM垃圾回收算法

自动化的管理内存资源&#xff0c;垃圾回收机制必须要有一套算法来进行计算&#xff0c;哪些是有效的对象&#xff0c;哪些是无效的对象&#xff0c;对于无效的对象就要进行回收处理。 常见的垃圾回收算法有&#xff1a;引用计数法、标记清除法、标记压缩法、复制算法、分代算…

如何消除视频中的背景噪音

如果你在繁忙的街道上、刮风的日子、或在其他有嘈杂声音的周围拍摄视频&#xff0c;则会产生令人烦恼的噪音。幸运的是&#xff0c;从视频中消除背景噪音并不是一件困难的事情&#xff0c;因为有许多可靠的降噪软件可以提供帮助。本文就收集了3种最佳方法&#xff0c;可帮助你轻…

[RoarCTF 2019]Easy Calc1 wp

[RoarCTF 2019]Easy Calc1 wp 预测试 手工测试 这个页面实现了一个简单的计算器功能&#xff0c;当输入 11 时能正确返回执行结果 2&#xff0c; 但当输入 11&&ifconfig 之类的表达式时&#xff0c;会出现弹窗&#xff1a; 查看源码 前端页面调用了一个函数&#xf…

掌握 RPC 接口测试:一篇详尽的接口测试手册

RPC 是什么&#xff1f; 远程过程调用协议&#xff08;RPC&#xff09;是一种技术&#xff0c;它允许在不同的机器上执行函数&#xff0c;就好像这些函数是本地调用一样。简单地说&#xff0c;客户端系统透明地从网络上的远程服务器软件请求服务&#xff0c;而无需理解复杂的网…

借助文档控件Aspose.Words,在Java中比较 Word、PDF 和 PPT 文档

文档比较是各个领域的一项关键任务&#xff0c;包括法律、出版和内容管理。它确保准确跟踪和审查对合同、报告或法律协议等文档的更改。Java 开发人员经常寻求高效可靠的方法来执行文档比较&#xff0c;而Aspose提供了强大的解决方案。在这篇博文中&#xff0c;我们将探讨如何高…

浏览器的事件循环机制(Event loop)

事件循环 浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; …

C语言——字符函数和字符串函数(二)

&#x1f4dd;前言&#xff1a; 上一篇文章C语言——字符函数和字符串函数&#xff08;一&#xff09;对字符函数和字符串函数strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat进行了初步的讲解 这篇文章主要再讲解几个我们常用到的其他字符串函数&#xff08;附…

teamCity使用

1.server部署 2.地址 http://10.172.48.7:32204/favorite/projects?modebuilds 3.新增项目 拉取git项目 编辑配置 复制其他项目配置 步骤1.Maven 步骤2 build image 步骤3 push image 步骤4 deploy to k8s

mfc140u.dll丢失的解决方法的详细介绍,六种解决mfc140u.dll丢失的方法

今天的这篇文章将向各位分享一个有关电脑出现关于丢失mfc140u.dll错误的弹窗问题&#xff0c;这是一个很常见的问题。无论你是一名大学生还是其他身份&#xff0c;都可能会遇到这个问题。下面我会对mfc140u.dll丢失的解决方法进行详细的介绍。 一.六种解决mfc140u.dll丢失的方法…

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库&#xff08;https://square.github.io/retrofit/&#xff09;&#xff0c;改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式&#xff0c;使得通过接口提交请求和相应的参数的配置&#xff0c;就可以获得…

辅助电源交流220V转5V200mA输出,不需要变压器

辅助电源交流220V转5V200mA输出&#xff0c;不需要变压器。 在当今智能家居、小家电等电子产品日益普及的时代&#xff0c;对辅助电源的需求也越来越大。一款高效、低成本、小巧封装的辅助电源芯片成为众多产品的迫切需求。今天&#xff0c;我们将为您介绍一款交流220V转5V200m…

Bytebase 2.12.0 - 改进自动补全和布局导航

&#x1f680; 新功能 支持 MySQL 高级自动补全。支持从 UI 上导入分类分级配置。 &#x1f514; 重大变更 作废已有企业版试用证书。之后可以通过提交申请获取新的试用证书。 &#x1f384; 改进 改进整体布局和导航。 支持在 SQL 编辑器里显示以及查询 PostgreSQL 数据…

“机器人V2.0时代已来”-任务规划难题迎刃而解,世界因机器人改变而翻转!

01-VILA背景简介 2022年&#xff0c;Michael Ahn, Anthony Brohan等人提出“Do as i can, not as i say: Grounding language in robotic affordances”算法。本文指出虽然大型语言模型可以编码关于世界的丰富语义知识&#xff0c;而这些知识对旨在对用自然语言表达的高级、时…

MAC配置环境变量

1、配置 JAVA JDK 1.1、查看 JDK 安装目录 &#xff08;1&#xff09;可以在Android Studio中查看&#xff0c;复制该路径 &#xff08;2&#xff09;也可以在官网下载 Java JDK下载地址 mac中的安装地址是"资源库->Java->JavaVirtualMachines"中 1.2、…