[读书笔记]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 泛型接口支持逆变,所以支持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关键字,如果以后用到再来百度就好了.
文字多增加一点内容,以后每个帖子后面都会加一些口语小贴士,这些都是自己平时看过的. 英语真的很重要,这里不用我多说大家应该都知道的.