CYQ.Data 数据层框架CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。 |
框架设计之菜鸟漫漫江湖路系列 开篇
框架技术交流区 |
|
|
| #楼主 |
自打.NET出了泛型之后,类型推断(Type Inference)就变得愈加强大。比如下面的代码: //常规泛型方法 var tuple1 = Tuple.Create<int, string>(2012, "二零一二"); //泛型方法的自动类型推断(编译时) var tuple2 = Tuple.Create(2012, "二零一二"); 以前需要定义泛型方法的参数类型,在基于编译时的类型推断系统的帮助下,立马简化为第二种写法。大大的提高了开发效率。
可是自动类型推断偶尔也会导致一些隐藏很深的bug出现。让我们先看一下下面的代码: class Foo { public Foo() { var list = new List<string>(); Execute(list); } void Execute(IEnumerable<string> list) { Console.WriteLine("Execute(IEnumerable<string> list) invoked"); } void Execute<T>(T anotherArg) { Console.WriteLine("Execute<T>(T anotherArg) invoked"); } } 这个对象中,我们定义了两个方法,一个是常规方法,其要求传入一个类型为IEnumerable<string>的参数。另外一个则是一个泛型方法,其接受一个类型为T的参数。 在主方法体中,我们构造了一个List<string>,并调用Execute方法。我想你也许会期望其调用的是第一个方法。但是如果将这段代码运行后,会发现编译器在编译时,通过类型推断,自动帮你链接到了第二个泛型方法的调用上。这是因为类型推断流程在进行方法链接的过程中,是依赖于如下的优先级: 1)类型完全一致的方法签名(这里如果加上一个void Execute(List<string> list)方法,那么就会链接到此方法上) 2)泛型方法签名的类型推断 3)参数类型可转换的方法签名 注意:此优先级是通过实验测出来的,MSDN没找到,如果你有官方文档,烦请告知小弟,多谢。
上面就是类型推断流程在编译期对当前类调用方法的链接过程。那么针对基类方法,其处理过程又是如何? class Foo : Parent { public Foo() { var list = new List<string>(); Execute(list); } void Execute(IEnumerable<string> list) { Console.WriteLine("Execute(IEnumerable<string> list) invoked"); } void Execute<T>(T anotherArg) { Console.WriteLine("Execute<T>(T anotherArg) invoked"); } } class Parent { protected void Execute(List<string> list) { Console.WriteLine("Parent::Execute(List<string> list) invoked"); } } 从刚才的执行优先级上我们可以知道,正对当前类,如果签名一致的话,则会调用此方法。在上面的代码中,基类定义了一个方法,其签名和子类的调用签名是一致的,但是当我们执行这段代码会发现,方法实际上链接到了子类的Execute<T>泛型方法体上。因此,上述的链接优先级,对基类方法不起作用。 当然,如果你将方法的调用前面加入base.Execute关键字,则一定会进入到基类的方法体中。
最后,说一下个人感觉: 1)类型推断是好东西,应该顶。不过要慎用,尤其是方法重载比较多的情况下。 2)编译器在方法链接的过程中,针对泛型方法其优先级还是比较高的,因此如果出现多个方法重载,且包括泛型的情况下,一定要多点小心。 3)如果自己明确的清楚自己要调用的方法是处于基类时,最后能够加入base关键字,以避免不必要的问题。当然,如果你已经对.net游刃有余,当然不必。 4)项目代码最终是要交给别人维护的,如果希望自己能早日甩掉这个摊子去玩些新东西,就最好能够写出让维护者一目了然的代码,否则永远甩不掉(扯远了 -_-!!)
这个账户注册5年了,就没好好写过一篇技术文章,惭愧。虽然所学有限,但还是希望可以将自己的一些心得分享出来,权当抛砖引玉。希望大家编码愉快! |
发表评论
论坛公告
帖子搜索
最新帖子
最新评论
- 请教博主。我mysql的提示 V5.7.7.4 MySql.xxxx:check the tablename "tbl_site_info" is exist? error:ExeDataReader():Expression #1 of ORDER BY clause is not in SELECT list, references column 'information_schema.s1.ORDINAL_POSITION' which is not in SELECT list; this is incompatible with DISTINCT 配置如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Conn" connectionString="host=192.168.3.101;Port=3306;Database=xxxxx;uid=root;pwd=2017" providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>
- 查询语句有点问题,软件启动时查询语句可以从数据库查询出数据,软件一直运行时无论怎么修改数据库,查询出来的还是老数据,不知道是为什么
- 我语句中用到了union all而且两个查询都有查询条件,action.select总是不成功,不知道有没有什么好的解决办法,谢谢
- 大神,如果我想通过一个对象(从数据映射过来的)要插入的话,我需要遍历字段然后每个set一下吗?有没有更好的方法??
- 真心好用,想问下秋天直接拼写sql怕注入吗
- V4.5后,好多方法都改变了,求来个新的日志帮助
- 請問大神V5源碼要多少錢 我是和交流過的
- 楼主,,从数据库里查出来并绑定datagridview,但是显示的都是数据库里的英文名,怎么改??好纠结啊这个。。。。
- 我想问一下,主从表添加怎样处理
- 10年就过了!!!!