c#3.0的改进.doc_第1页
c#3.0的改进.doc_第2页
c#3.0的改进.doc_第3页
c#3.0的改进.doc_第4页
c#3.0的改进.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深入理解C# 3.0的五项主要改进2009-01-25 07:00作者:zhengzhong1.隐型局部变量C# 3.0引入了一个叫做“var”的新关键字。这个关键字允许开发者建立一个变量,但不必明确它的类型。例如,用var说明一个字符串,就像这样:varmyData = This is my data;注意,这里并没有提到myData变量是一个字符串,而C# 2.0却要求这一点。虽然var允许您建立隐含的类型,它并没有降低C#浓厚的类型特征。var关键字只有在建立变量时有用,一旦您建立变量并且确定它的类型以后,就不能再用var来改变一个变量的类型。例如,这段代码没有作用:varmyDate = DateTime.Now;myDate = Hello.;使用var关键字还会产生一个有趣的结果,它可以帮助开发者减少建立变量时的代码输入。例如,在C# 2.0中建立一个Customer对象,需要输入以下代码:Customer myCustomer = new Customer();使用新的var关键字,则只要输入:varmyCustomer = new Customer();var关键字的另一个特点在于,使用它可以避免改变一个返回某个类型对象的方法调用。例如,在C# 2.0中,如果您需要调用一个返回Customer对象的方法,您应该编写以下代码:Customer myCustomer = GetByName(Zach);如果某个时候GetByName方法返回一个不是Customer的对象,这段代码就无法编译。但是,如果应用var关键字,您就不用担心GetByName返回的对象类型。varmyData = GetByName(Zach);现在,因为应用了var关键字,GetByName方法能够进行改变,返回一个Person对象,这个方法调用也依然有效。2.extension方法在C#中,您不能继承和扩充用访问标识符标记为“封装”的类型。但在C# 3.0中,extension方法允许您扩充任何类,甚至是标记为封装的类。例如,如果希望添加一个NoSpaces()方法到字符串类中,我们要定义一个类似列表A中的extension方法。namespaceMyExtensionMethodspublic static class Extensionpublic static void NoSpaces(this string data)return data.Replace( , );在一个类中导入这个extension方法时,开发者就能够对这个类包含的任何字符串调用NoSapces()方法。extension方法的第一个参数决定extension方法的有效类型。在这种情况下,“这个字符串数据”(this string data)表明extension方法适用于字符串类;如果extension方法以“这个对象数据”(this object data)为第一个参数,则说明这个方法对每个对象有效。要表明您希望导入extension方法,只需在它们的命名空间中包括一个using指令。例如,要应用上面说明的方法,需要在类文件中包括一个using MyExtensionMethods指令:usingMyExtensionMethods;namespace MyNamespacepublic class MyClasspublic MyClass()string data = this is my data;/nospaces will contain thisismydata.string nospaces = data.NoSpaces();注意extension方法的优先度比instance方法低。因此如果instance方法和extension方法有同样的签名,则应执行instance方法。3.对象初始化器在C# 2.0中,开发者认为建立许多构造器来设定某个属性值为对象初始化过程。下面是一个例子: 类访问Customer方法:Customer myCustomer = new Customer(Zach, Smith);Customer类构造器:public Customer(string firstName, string lastName) : this()this.FirstName = firstName;this.LastName = lastName;public Customer()C# 3.0介绍了一个初始化对象的新方法,它允许您在初始化对象时设定任何属性值。例如,在C# 3.0中,上面的代码块可以写成:类访问Customer方法:Customer myCustomer = new CustomerFirstName = Zach, LastName = Smith ;Customer类构造器:public Customer()在C# 3.0代码中,没有与初始化对象对应的构造器。这样,开发者就不用为每组需要设定的属性建立不同的构造器。这样产生的另外一个效果是:代码变得更容易阅读了。例如,虽然我们清楚知道下面的代码对一个Car对象进行了初始化,但我们并不清楚其中变量的作用:Car car = new Car(18, 10, 550);一眼看来,下面这行代码更易阅读,尽管我们必须输入更多代码:Car car = new Car WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 ;4.匿名类型C# 2.0引入了匿名方法,C# 3.0推出匿名类型。匿名类型与匿名方法类似,它们都是以嵌入方式建立,并没有正式的名称。在建立一个匿名类型,您必须组合上述对象初始化器和隐型局部变量两个概念。下面是一个匿名类型的例子:varmyType = new Length = 79, Width = 30 ;匿名类型的范围与任何其它变量的范围相同。例如,下面代码块中的cobra实例仅仅在Speed函数块中有效:private void Speed()var cobra = new Horsepower = 550, Torque = 570 ;如果一个匿名类型被初始化而另一个匿名类型位于范围域中,并且它们的签名相同,第二个类型将自己占用第一个类型的类型。例如,在下面这段代码中,cobra和mustang都是匿名类型,并且可以彼此设定。private void Speed()var cobra = new Horsepower = 550, Torque = 570 ;var mustang = new Horsepower = 300, Torque = 300 ;mustang = cobra; /or you could say cobra = mustang5.LINQ在之前的C#版中,开发者应用许多不同的查询语言来访问不同的数据源。例如,要查询一个XML文件,开发者会使用XPath,要查询一个SQL数据库,开发者将使用SQL。在过去这种方法十分有效,并且现在仍然是访问各种数据的主要方法。但是,这种方法具有一些缺点。 一个显著的缺点在于:开发者必须以一种不同的语言,而非他们当前使用的语言(如SQL或XPath)来编写查询代码。另一个缺点是,在执行某些查询语言,如SQL时,开发者必须编写映射代码将查询结果转化为可用的C#业务对象。C#3.0推出一种称之为语言集成查询(LINQ)的新方法。应用LINQ,开发者可以编写出能够搜索任何IEnumerable数据源的代码。所以除了应用TSQL访问MS SQL数据库,应用XPath访问XML文件外,他们还可以应用LINQ。下面的代码是一个LINQ查询的例子,它返回所有OrderCount大于10的顾客:using System;using System.Query;using System.Collections.Generic;public class SampleClassstatic void Main()List customers = GetCustomers();/Write our query to retrieve customers who have more than/ 10 orders.IEnumerable queryResult = from customer in customerswhere customer.OrderCount 10orderbycustomer.IDselect customer;与SQL或XPath不同,LINQ查询用C#,而非第三方语言编写。这样,查询就不会出现类型问题,开发者也就没有必要编写映射代码把查询返回的数据转化成C#对象,而由LINQ API自动处理映射。基本上,在ORM解决方案中,LINQ对象用途很大。同样,它的范围也非常广泛,有大量MSDN信息描述了它的功能。欲了解更多信息,请访问LINQ主页。学习LINQ查询时,经常会遇到LINQ查询数据库问题,这里将介绍LINQ查询数据库问题的解决方法。您可以通过LINQ来编写针对各种数据源的查询访问信息。您不必在使用SQL语法,因为LINQ提供了c#语言来处理,并提供了相同的类型及表达的功能。这是很重要的因为像一个 LINQ 提供了一个声明性方法允许您编写更面向对象的程序。可以使用 LINQ编写C# 代码,列出使用 LINQ查询数据库,并创建 XML 文档:1. varcontacts 2. /从数据库检索客户表 3. fromcustomerindb.Customers 4. wherecustomer.Name.StartsWith(A)&customer.Orders.Count0 5. orderbycustomer.Name 6. selectnewcustomer.Name,customer.Phone; 7. varxml 8. /从客户列表生成XML数据 9. newXElement(contacts, 10. fromcontactincontacts 11. selectnewXElement(contact, 12. newXAttribute(name,contact.Name), 13. newXAttribute(phone,contact.Phone) 14. ) 15. );这段代码含义是从数据库中提取数据并从中创建一个 XML 文档写入所需内容。使用LINQ您会感觉到更容易、更自然。您将很快看到更多 LINQ 查询,但目前集中在语言方面。与from, where, orderby,和select 关键字在表里,很明显他们已经扩展进c#的LINQ工具里。我们刚才所展示的是 C# 代码,但 LINQ 跨编程语言提供常见查询体系结构。他工作在 C# 3.0 and VB.NET 9.0 (即 VB 2008),因此需要专用的编译器,但是,可以其移植到其他.NET 语言。从目前来看F#已经有了LINQ功能,未来会有更多.NET语言得到LINQ的支持。图中的查询使用的是在 C#语法而不是在新的语言。LINQ并不是一种新的语言。它被集成到 C# 和 VB.NET。 此外,LINQ 可以用于避免.NET 编程语言与 SQL、 XSL 或其他特定于数据的语言想混淆。 LINQ 使查询通过多种类型的数据存储到编程语言的语言特定扩展集中。您可以把linq视为通用远程控制。有时,您 会使用它来查询数据库 ;在其他方面,您也可以查询 XML 文档。您只需使用您喜欢的编程语言不必切换到SQL 或 XQuery 等查询语言。我们只给您提供简略讲了LINQ查询数据库。此时最大的问题是:为什么我们希望使用 LINQ 之类的工具?为什么不使用以前其它的工具呢?LINQ创建在程序语法里,也同存在于关系数据库和XML文档里。LINQ 来源于项目是一个简单的事实:在应用程序中用来驱动和与数据库进行连接。因此应用程序中只懂一门c#语言是不能满族需求的,你还要学习另一些语言,例如SQL语法,配合连同 C# 以形成完整应用程序的 API。我们将首先来看一段使用标准的.NET API 的数据访问代码。我们会指出,在这种代码中遇到的常见问题。然后,我们将通过显示如何这些存在问题与其他类型的数据如 XML。你将看到LINQ 地址之间数据源的一般不匹配和编程语言扩展我们的分析。LINQ 数据库public static IQueryable GetClicksTopBooks(int topNum) Books books = new Books(ConnectionString); var topBooks = (from book in books.Tbl_books orderby book.Clicks descending select book).Take(10); return topBooks; IT168技术文档】1C#3.0简述 C#3.0 已经推出有一段时间了,相信大家也和我一样对其中的技术亮点激动不已吧,Automatic Properties, Object/Collection Initializers, LINQ Language, Extension Method等无数的新技术大大加快了我们的开发进程,下面我将以一个网络书店的实例向大家展示LINQ语言在数据检索方面的巨大优势。 LINQ全名叫做Language-Integrated Query,字面意思就是集成到语言中的查询语言,目前在C#3.0,VB9中你都可以使用这种语法用来在数据集合,XML文件和数据库中检索数据。举个例子来说,比如我们数据库表users中的所有用户取出来,以前的做法可能是使用一个SqlCommand来初始化查询,然后取回数据结果集,最后再对结果集进行分析,而现在使用LINQ只需要写一行语句即可: var allUsers = from user in users select user; 是不是很简单呢:) 下面给大家介绍一下网络书店项目需要用到4张表。Tbl_booksTbl_UsersTbl_BillsTbl_type3用户搜索模块的实现现在回到我们的网站,作为一个网络书店,最重要的一点是,让用户迅速找到自己想要的书,另一方面,书店也要不断的通过更新数据来留住顾客用户,比如设立排行榜,每天都放置一些特价图书等等,下面我将详细介绍LINQ是如何实现这两方面内容的。 用户搜索模块 一般来说,网站会提供一个搜索框,然后用户输入关键字用于对作者、标题或者简介的搜索,在这里为了说明简便,我把多项搜索和到了一起,即只要关键字出现在三者之一,程序就把它们搜索出来。 public IQueryable GetSearchBooks(string keyWord) Books books = new Books(ConnectionString); var searchBooks = from book in books.Tbl_books where ( book.Title.Contains(keyWord)| book.Author.Contains(keyWord)| book.Description.Contains(keyWord) ) select book; return searchBooks;   大家注意,我们在这里返回了一个IQueryable的接口,其中Tbl_book就是我们之前用SqlMetal工具生成的一个实体类,我们可以轻松地在数据显示层调用这个方法: foreach (var tbl_book in BooksProvider.GetSearchBooks(keyWord) /. 大家可以对比一下传统做法,就会发现代码简单了很多。 public IList GetSearchBooks(string keyWord) SqlConnection conn = new SqlConnection(ConnectionString); conn.Open(); SqlCommand command = new SqlCommand(select * from tbl_books where title = keyWord or author = keyWord or description = keyWord); command.Parameters.Add(keyWord, SqlDbType.VarChar).Value = % + keyWord + %; SqlDataReader reader = command.ExecuteReader(); /这里的Book是另外定义的tbl_Book的实体类 List retList = new List(); while (reader.Read() Book book; book.id = reader.GetInt32(0); book.title = reader.GetString(1); book.type_id = reader.GetInt32(2); book.price = reader.GetDouble(3); book.author = reader.GetString(4); book.description = reader.GetString(5); book.add_time = reader.GetDateTime(6); book.user_id = reader.GetInt32(7); book.image = reader.GetString(8); book.clicks = reader.GetInt32(9); book.isspecial = reader.GetInt32(10); retList.Add(book); return retList; 在这里,大家可能会发现这样一个问题,上面的代码都是返回了整个tbl_book表格的结构类型,但有时候我们并不需要tbl_book所有的整个字段,这些不需要的字段就造成了存储空间的浪费。举个例子,用户在修改密码时我们只要用户名和密码是否一致就可以,如果此时把整个tbl_user都返回,那么其他的字段空间都被浪费掉了,对于这种情况,我们将代码修改如下: Books books = new Books(ConnectionString); var usersChangePwd = from user in books.Tbl_users where ( (name = user.User_name) & (pwd = user.User_pwd) ) select new user.User_name, user.User_pwd ; 大家可以看到,这里返回了一个匿名类型,其中只有User_name,User_pwd这两项属性值,但这对于用户修改密码这个逻辑来说已经足够了。如果用传统方法来实现我们需要再定义一个数据类型,显得不够灵活。 同样,我们可以在数据显示层用foreach语句把数据取出来: foreach (var user in usersChangePwd) string user_name = user.User_name; string user_pwd = user.User_pwd; strong4排行榜、特价书等逻辑的实现 首先看排行榜的实现: public static IQueryable GetClicksTopBooks(int topNum) Books books = new Books(ConnectionString); var topBooks = (from book in books.Tbl_books orderby book.Clicks descending select book).Take(10); return topBooks; 这里使用了LINQ的Take语句,首先按价格从高到低排列,然后取出排在前面的10个数据。下面我们看一下特价书的实现: public IQueryable GetSpecialBooks() Books books = new Books(ConnectionString); Books booksSpecial = from book in books.Tbl_books where (book.Isspecial = true) select book; return booksSpecial; 下面再介绍一个例子,使大家对LINQ有更深一层的理解。 例如:我们现在需要统计出各个类别的图书分别有多少本,以及各类图书的点击总量 var groupBooksNumAndClicks = from book in books.Tbl_books group book by book.Type_id into g select new type = g.Key, booksSum = g.Count(), clicksSum = g.Sum(p = p.Clicks) ; 这里使用了Group by语句和扩展方法Sum轻松的实现了这一逻辑,这里的匿名类型中type显示的是type id,可能读者朋友们觉得不够直观,没关系,我们稍作修改如下: var groupBooksNumAndClicks = from book in books.Tbl_books from type in books.Tbl_types where book.Type_id = type.Id group book by type.Name into g select new type = g.Key, booksSum = g.Count(), clicksSum = g.Sum(p = p.Clicks) ; OK!这里我们把tbl_type表也添加进来,并把group的Key值设为type.Name,这样我们取出的type就是真实的类型名称了。 5总结 从上面几个例子可以看出,LINQ语句将SQL的部分语法整合进C#语句中,使得程序在检索数据方面显得相当灵活,增强了编程语言在数据检索方面的能力,使我们能够更加专注于数据逻辑的设计而非实现。上面的介绍只是对LINQ应用的一个简单介绍,更多的内容还等着朋友们自己去发掘哦:) 2010-08-12C# 3.0 入门系列(linq)(一)文章分类:.net编程 谈到dlinq ,就不得不先说linq 。让我们先看看什么是linq 。linq 是Language Integrated Query 的缩写。那么事实上dlinq 就是Database Language Integrated Query 的缩写。linq 和dlinq 最大的区别就在与linq 是对内存进行操作,而dlinq 的操作对象为数据库。我们先来看一个linq 的例子。在这之前,你需要安装s2008 beta 版本。可以到/en-us/vstudio/aa700831.aspx 下载。如果,你的机器上是vs2005 的英文版,你还需要安装一个linq preview 版本。你可以到下面地址去下载。/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&displaylang=en 微软也提供了好多学习的地方。先给出几个链结。/data/ref/linq/ /data/ref/linq/default.aspx?pull=/library/en-us/dndotnet/html/linqprojectovw.asp /vcsharp/future/ 好,我们先来看一个linq 的例子。这个例子可以从linq 的说明文档上得到。 C#代码 1. usingSystem; 2. usingSystem.Query; 3. usingSystem.Collections.Generic; 4. 5. classapp 6. staticvoidMain() 7. stringwebSitenames=,,, 8. ,,, 9. ,; 10. 11. IEnumerableexpr=fromsinwebSitenames 12. wheres.Length=22 13. orderbys 14. selects.ToUpper(); 15. 16. foreach(stringiteminexpr) 17. Console.WriteLine(item); 18. 19. using System; using System.Query; using System.Collections.Generic; class app static void Main() string webSitenames = , , , , , , , ; IEnumerable expr = from s in webSitenames where s.Length = 22 orderby s select s.ToUpper(); foreach (string item in expr) Console.WriteLine(item); 你可能感觉比较陌生。放心,这大概是第一次看到缘故。在这里像 from ,where ,orderby, select 等都是linq 的保留字,都该用蓝色显示的,但是好像cnblogs 还没有开始支持。所以插入代码时,他们就被当作普通字符了。其实,query expression 看起来和sql 语句很像。比如 select * from table1 where column1 = ;我第一次看到linq 时,就感觉是写在程序里的sql 语句。只不过,以前我们都是用string 类型形成一个sql 语句,然后通过command 或adapter 传到sql server 中。而现在,感觉就像把sql 语句直接当成程序代码来实现。这只不过是我们的一个错觉。这个例子,只不过是从一个string 的数组中,提取出长度为22 的,并且把提取的数据全部变成大写。 IEnumerable 使用到了c#2.0 中的泛型。 该列子的结果,返回一个数据集,存放到expr 中。 在这里,从那个数据集中取的结果,是用in 表达的,如列所示, from s in webSitenames , 在webSitenames 集合中,取出s 。s 代表一条条纪录。where 表示条件,orderby 表示按什么排序。select 选择那些字段组成变量。这里,你可能会觉得奇怪,s 变量在那里声明的呢。我第一看到这里的时候,也感到奇怪。其实s 变量是webSitenames 变量里的元素,你在in webSitenames 时,已经声明了s 变量。在这个列子中,大家可以先感受一下linq ,在随后的章节中,我会为大家介绍更多。对内存数组的查询,并不能显示出linq 的强大功能,对数据库的操作,才使得linq 更加具有实际意义。 在随后的章节中,我将逐渐介绍dlinq 的语法。 C# 3.0 入门系列(linq)(二)文章分类:.net编程 在第一篇中,我已经和大家简单介绍了linq 。也和大家提起linq 是C# 3.0 里的一个特性。不过,你去装linq priview 时,你会发现,它提供了许多vb 的linq 代码。从现在的情况看,linq 会被移植到.net framework 下。在本篇中,笔者将开始更加详细的介绍dlinq 。同时,也会介绍很实用的技巧和方法。在这之前,你需要安装s2008 beta 版本。可以到/en-us/vstudio/aa700831.aspx 下载。如果,你的机器上是vs2005 的英文版,你还需要安装一个linq preview 版本。你可以到下面地址去下载。/downloads/details.aspx?familyid=1e902c21-340c-4d13-9f04-70eb5e3dceea&displaylang=en 以后的章节中,笔者将会配合这个版本,进行讲解,并对它里面提供的例子进行详细的说明。安装linq preview 后,你可以在安装目录下,找到安装程序提供的例子。C# 的应该在C:Program FilesLINQ PreviewC#SamplesSampleQueries 目录下。打开该工程。因为dlinq 主要是对数据库进行操作,你还需要准备数据库。例程给你提供的数据库是用.SQLEXPRESS 来实现的。说实话,这个版本的数据库实在是难用。我建议大家使用SQL2000 or SQL2005. 你可以在C:Program FilesLINQ PreviewData 目录下找到一个叫做NORTHWND 的数据库文件。如图所示,把它附加到你的服务器上。因为NORTHWND 是SQL SERVER 附带的例子数据库,你可能需要将原来的删掉,才能附加新的上去。你也可以到/en-us/bb330936.aspx 下载for beta2 的sample 。其数据文件的路径为,LinqSamplesSampleQueriesData你在附加这个数据库的时候,有可能碰到SQL2000 附加不上去的问题。你可以给我留言,我这里有SQL2000 的数据库备份。在附加完数据库后,你需要修改程序文件了,让SampleQueries 的程序使用你刚附加的数据库。打开SampleQueries 的程序,在Solution Explorer 中找到DLinqSamples.cs 文件,打开它,找到24 行。如下的代码。 private readonly static string connString=AttachDBFileName=+dbPath+;Server=+sqlServerInstance+;IntegratedSecurity=SSPI;enlist=false; 将它替换为 private readonly static string connString=Server=yourSever;Database=northwind;User=yourname;Password=yourPassword; 这样,你就可以使用你刚附加的数据库了。或许你要问为什么非要用这个新的数据库,为什么不用SQL SERVER 附带,那是因为在这个新的数据库中,我们添加了许多新的东西。_一切都准备好以后,我们就可以来看这个例子了。笔者在这么没有兴趣讲解SampleQueries 是如何设计的,也没有兴趣讲解它是如何取到code 的。这里我们只讲dlinq 。先让我们来看看大体的一个界面。 界面做的很漂亮也很简洁。选择左边目录树,第一个主接点是linq 的101 例子,前面我也和大家讲过来linq 的主要是针对内存操作。dlinq 才是针对数据库操作。我们的重点依然在dlinq 上。如图所示,选择where 接点中第一个,然后右边代码区会显示该段代码,点run sample! ,下面会首先出现程序翻译的sql 语句,再下面是返回的数据集。( )在正式讲解dlinq 的语法前,笔者也许还要把northwind 数据库中的表以及表之间的关系简单地和大家交代下。 几个表的关系如上图。我们常用的几个要说明下。一个是Customers 表为客户表,一个是Orders 表为订单表,一个是Products 表为产品表,最后一个是Order Details 表,为订单详细表。因为northwind 是大家已经很熟悉的一个数据库,我就不再做赘言。 下章,我将依然为大家准备最关键的一个环节,影射文件。 C# 3.0入门系列(LinQ)(三)文章分类:.net编程 从本节开始,笔者将会和大家一起开始体验dlinq 了。前面我们准备了数据库,也对数据库之间的关系做了初步的了解。有了数据库之后,数据和对象是一个什么样的关系呢?从dlinq 的设计来看,它主要是为了解决data!=objects 的问题而产生的。那么,现在,有了dlinq 后数据和对象之间就可以有一个一一对应的关系了。我们既可以根据数据库生成这种影射的代码,也可以根据影射代码生成数据库。简单的说,数据库和影射代码实现了相互转化。linq preview 提供了一个很好的工具,可以帮我们实现从数据库到代码的影射。它就是sqlmetal 。beta2 的sqlmetal 在C:Program FilesMicrosoft SDKsWindowsv6.0Abin 目录下,或C:WINDOWSMicrosoft.NETFrameworkv3.5 目录打开cmd ,运行sqlmetal 程序。会出现下面的提示。 运行如下的命令。 sqlmetal /server:myserver /database:northwind /namespace:nwind /code:nwind.cs/language:csharp你可以根据northwind 数据库生成一个nwind.cs 文件。你会在 linq priview 的bin 目录发现它_ 。这里的参数的含义也非常的明确,笔者也不在多赘述。在这里,我想和大家简要介绍下这个影射文件nwind.cs 因为这个是程序自动生成的,我们暂时最好不要改,在后面的进阶中,我将为大家详细阐述此文件中code 的含义,以及实现inheritance 我们先来看Northwind 类的定义。() public partial class Northwind : DataContext 首先partial 关键词是C . 中出现的,本文不是讲解C . 的,相关知识请参阅相关文献。Northwind 的名字是根据你数据库的名字定义的我们发现,它必须从DataContext 类继承,才可以获得dlinq 的支持。再往下看 public Table Orders; public Table Products; public Table OrderDetails;Table 类是dlinq 中定义的,这里他用了一个范性的概念,类似于C+ 中的模板。但C# 和C+ 还是有区别,C+ 的泛型模板类似替换,只是编译时用实际类型进行替换,因此对任何类型都可以,但是C# 的泛型是在虚拟机级别上的实现,因此在编译时会进行类型检查(引)。Order, Product 和OrderDetail 等,都是sqlmetal 程序根据数据库里对应的表,自动产生的类。也就是class 和table 是一一对应的。而这样也恰恰实现了object 和data 的对等。让我们去看看Order 的定义吧。我这里只贴出部分。 只简单介绍几个点,更加详细内容

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论