微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性

<p style="background: gray; color: #ffffff; font-size: 18pt;">前言

内容了,这一部分终于要更新完了. 同时感觉再来读第二遍也有不一样的收获. 今天很嗨的是武汉下雪了,明天周六,一切都是这么美好.哈哈哈.内容有: 可选参数和命名实参,泛型的可变性,动态类型

调用方法时,该参数可以明确指定实参,也可以不指定实参.如下代码:

<div class="cnblogs_code">

                  TestMethod(,,         TestMethod(,   
     方法
       TestMethod( x, y = , name =           Console.Write(  }

打印结果如下图:

一个系统的后期维护很好使用,在真实的项目中我也使用过这样的用法,如下例:

添加新的user登陆)和TransferUser(logout当前user,然后登陆新的user)两种方式数量进行限制,而SwitchUser和TransferUser使用的都是同一个限定Check方法,而两种对User的操作方式不同,所以导致TransferUser会出现问题.解决方案就是仍然使用同一个Check方法,但是给这个Check方法添加一个可选参数来判断到底是执行的哪个操作,然后根据不同的操作去做相应的修改.

默认值必须为常亮.arams修饰符声明)不能做为可选参数

一个系统中有两个可选参数,而我们想省略掉第一个可选参数怎么办呢? 命名实参这个时候就可以帮助我们了.

TestMethod(, TestMethod( 名称,通过使用命名实参,只省略y参数 TestMethod(,name : 名称 TestMethod(x: ,y: ,name: 方法 TestMethod( x, name = Console.WriteLine( }

打印结果如下图:

一个派生类隐式转化为基类. 大家可以这样记忆: 协变性即和谐(与"协"同音)的变化,标记泛型参数,以示其支持协变性. 为了更好的进行说明,下面用.Net类苦中的IEnumerable接口为例做演示:

List<> listObject = List<> List<> listStrs = List<> listObject.AddRange(listStrs); listStrs.AddRange(listObject); }

代码中,AddRange方法接收的参数类型为IEnumerable,该接口的定义为IEnumerable,因为其泛型参数有out关键字标识,泛型的类型参数T支持协变性,则可将List转化为IEnumerable(这是被继承的协变性支持的. 因为List实现了IEnumerable接口). 支持协变性,所以可以进一步把IEnumerable转化为IEnumerable

一个基类隐式地转化为派生类,C#4.0引入in关键字来标记泛型参数,以示其支持逆变性.为例进行演示:

Main( List<> listobject = List<> List<> liststrs = List<> 方法接收的参数类型为IEnumerable collection 代码是传入的是List类型的参数。 泛型类型参数T支持协变性,所以可以 转化为IEnumerable(这个是继承的协变性支持的) 接口委托支持协变性,所以可以把IEnumerable转化为——>IEnumerable类型。 错误了。 listobject.AddRange(liststrs); IComparer<> objComparer = IComparer<> objComparer2 = 类型的 liststrs变量的sort方法接收的是IComparer类型的参数 代码传入的是 IComparer这个类型的参数,要编译成功的话,必须能够转化为IComparer这个类型 泛型接口支持逆变,所以支持object转化为string类型 代码可以编译通过,在.Net 4.0之前的版本肯定会编译错误 代码就会出现编译错误,因为泛型的协变和逆变是C# 4.0 中新增加的特性,而.Net 4.0对应于C# 4.0。 liststrs.sort(objComparer); .sort(objComparer2); TestComparer : IComparer<> Compare( obj1, eto(obj2.ToString()); }

代码中,listStrs变量的Sort应接收IComparer类型的参数,虽然传入的实参是IComparer类型,泛型接口支持逆变,所以可将object转化为string类型.

支持协变和逆变,类或泛型方法的类型参数都不支持协变和逆变不支持协变和逆变(例如List无法转化为IEnumerable)标记类型参数

obj = obj = obj + ;错误 i = i = i + ;

代码中,第一行的obj为objec他类型,而编译器却检测出"+"运算符无法应用于object和int类型.

代码进行强制类型转换,从而使代码看起来更加简洁.调用Python等动态语言. 动态类型除了可以减少强制类型转换外,还可以让我们在C#语言中调用Python这样的动态语言.

一个dynamic关键字,如果以后用到再来百度就好了.

文字多增加一点内容,以后每个帖子后面都会加一些口语小贴士,这些都是自己平时看过的. 英语真的很重要,这里不用我多说大家应该都知道的.

原文地址:https://www.jb51.cc/csharp/72979.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐