News Feed 
Tuesday, October 12, 2010  |  From

为了给大家提供更好的服务,也为了域名安全以及其它事项,博客堂准备移民到美国Godaddy服务商,包括域名以及空间。

在未来一周的域名注册商更新期间,访问博客堂将会出现一些不正常现象,这可能是在迁移期间的正常现象,请大家谅解。

另外,提请所有的博主注意,我们将会以WXR(WordPress eXtend RSS)文件格式为大家提供数据备份服务,包括大家所有的历史数据:随笔、标签、文章中图片等。如果大家愿意跟随我们一起移民,不需要任何动作。如果不希望移民,而想转去其它博客提供商,并且希望索取备份文件,烦请与我邮件联系,非常感谢。

谢谢大家的关爱。



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Monday, October 11, 2010  |  From

[原文发表地址]:Announcing Windows Phone 7 Developer Tools
[原文发表时间]:Thu, Sep 16 2010

clip_image001[4]clip_image002[4]

今天,我们宣布Windows Phone 7开发工具发布。

Windows Phone 7开发工具让您能在Visual Studio中设计和测试Windows Phone 7应用程序。这些免费的工具为您提供了创建丰富的Silverlight和XNA应用程序并将它们部署到Windows Phone Marketplace所需要的一切东西。

Windows Phone开发工具包括以下内容:

  • Windows Phone版Visual Studio 2010 Express
  • Windows Phone模拟器
  • Windows Phone 版Microsoft Express Blend XNA Game Studio 4.0
  • XNA Game Studio 4.0

那么,有什么新东西呢?

Windows Phone开发工具的测试版比,正式版有哪些改变呢?

新模板

我们增加了两个新的符合Windows Phone 7设计系统指导的模板,来帮助创建基于 panorama和pivot的Windows Phone应用程序。Panorama模板使得应用程序开发人员可以轻松地实现横跨多个屏幕显示信息的设计。Panorama模板中预置了适当的UX行为,以确保平台的一致性。下图是Panorama控件在Windows Phone版Expression Blend模拟器中的样子。

clip_image001

Pivot模板提供了一种管理你的应用程序视图或页面的方法。Pivot控件可用于过滤大量的数据、查看多个数据集或应用程序视图之间的转换。您可以在下图中看到一个在Windows Phone版Visual Studio设计器和模拟器中的Pivot控件的例子。

clip_image002

增强的调试功能

Windows Phone 7工具为调试Windows Phone应用程序提供了完美的体验,让您可以在模拟器中运行并调试您的应用程序,包括在活动和暂停模式之间转换。这可以帮助您在将应用程序部署到设备中之前解决其中的问题。

本地化支持

开发人员现在可以在Windows Phone 7支持的各种语言环境中测试他们的应用程序,包括法语,意大利语,德语,西班牙语和英语。开发人员可以使用设置菜单来选择不同的语言,然后Windows Phone模拟器会根据所选定的语言启动。下图展示了在语言设置中选择法语后的模拟器。

clip_image003

clip_image004

发布到Marketplace

现在,您已经完成了您喜欢且令人兴奋的应用程序了,准备好与全世界分享它并顺便赚一些钱了吗?

当您的应用程序准备好发布时,它必须经过认证流程,以确定是否有资格在Windows Phone Marketplace中列出。首先,您需要在Marketplace注册为Windows Phone 7开发人员。然后,使用Windows Phone开发人员门户,您可以上传应用程序的二进制文件已备验证、测试认证以及发布到Marketplace。

我介绍一下吧!

您可以从Windows Phone页面免费获得该工具。欲了解更多有关Windows Phone 7开发,请访问Windows Phone开发博客。如欲了解更多有关应用程序提交Windows Phone Marketplace的信息,请参阅应用程序认证文件。

Namaste!



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Sunday, October 10, 2010  |  From

【原文地址】Data Annotations in the Entity Framework and Code First
【原文发表日期】 30 Mar 2010 10:14 PM

数据注释(Data annotation)特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式。之后,RIA服务也开始使用数据注释,现在成了Silverlight的一部分。Code First允许你使用C# 或VB.NET代码来建立EDM实体框架模型,目前是第三个CTP版本(【译注:当前最新版本为CTP4,本文是在CTP4之前发表的】)。

从这些CTP版本得到的反馈表明,对Code First在类和属性定义中读取数据注释特性来配置象最大字符串长度,哪个属性是键,或者是用于存储实体类型的数据表名等方面,有很大的需求。

本贴对我们将采用的现有数据注释特性以及提议的新特性做个概述。

使用数据注释

在使用Code First建立一个模型时,你先编写一堆实体类。例如:

public class Book
{
    public string ISBN { get; set; }
    public string Title { get; set; }
    public string AuthorSSN { get; set; }
    public Person Author { get; set; }
}

public class Person
{
    public string SSN { get; set; }
    public string Name { get; set; }
    public ICollection<Book> Books { get; set; }
}

在CTP3版本的Code First中使用这个类模型时,如果你想要对类的属性有所约束的话,你需要使用流畅API来描述哪个属性是键,存在哪些关系,每个字符串属性的长度等。这些是非常常见的任务,我们想要Code First的用户不用流畅API描述模型,就能够做这类的配置。通过使用数据注释,上面的模型特征可以作为类定义的一部分用声明的方式表示出来:

public class Book
{
    [Key]
   
public string ISBN { get; set; }

   
[StringLength(256)]
    public string Title { get; set; }

    public string AuthorSSN { get; set; }


    [RelatedTo(RelatedProperty=“Books”, Key=”AuthorSSN”, RelatedKey=”SSN”)]
    public Person Author { get; set; }
}

public class Person
{
    [Key]
    public string SSN { get; set; }

    [StringLength(512)]
    public string Name { get; set; }

    [RelatedTo(RelatedProperty=”Author”)]
    public ICollection<Book> Books { get; set; }
}

现有的数据注释特性

在System.ComponentModel.DataAnnotations命名空间中,几个现有的数据注释特性可为Code First所用。这些特性是:

KeyAttribute

KeyAttribute 用于指定一个属性或字段是实体主键的一部分,只可用于标量属性(scalar properties)。

StringLengthAttribute

StringLengthAttribute用于指定字符串的最大长度。因为在Code First 或实体框架中没有最小长度一说,该特性的MinimumLength属性会忽略不计。这个特性只可用于字符串类型。

在.NET 4.0中,负的MaximumValue是不允许的。但在下一个框架版本中,有人建议改变这个行为,将‘-1’ 视为“max”(最大值)。但这不是很理想,我们正考虑的另一个主意是使MaxStringLengthAttribute继承自StringLengthAttribute。MaxStringLengthAttribute不接受参数,但会采用最大可允值。

ConcurrencyCheckAttribute

ConcurrencyCheckAttribute用于指定一个属性或字段在EDM模型中拥有“fixed”(固定)的并发模式。固定的并发模式意味着这个属性是实体在做保存操作时所作的并发检查的一部分,只可用于标量属性。

RequiredAttribute

RequiredAttribute用于指定一个属性或字段不可是null值,可用于标量,复杂或导航属性:

  • 标量属性: 意味着该属性不能是null(即使CLR类型说它可以是null的)。
  • 复杂属性: 该特性在这里不允许使用,我们会抛出异常
  • 导航属性
    • 集合属性:该特性在这里不允许使用, 我们会抛出异常
    • 引用属性: 这意味着该外键属性不能是null,关系端头的基数性(cardinality)为“1”(而不是0..1)。

TimestampAttribute

TimestampAttribute用于指定一个byte[]属性或字段在模型中拥有“fixed”的并发模式,在存储模型中可当作时戳(timestamp)字段(在CLR中是不可null类型)。这个特性只可用于类型为byte[]的标量属性。一个实体只能有一个TimestampAttribute,这是大多数数据库平台所允许的。

DataMemberAttribute

DataMemberAttribute,虽然严格说不是数据注释集的一部分,但可用于帮助指定主键的序数(ordinal)。这在实体拥有复合主键,而且你想要对键在数据库中指定的顺序或在应用中使用的顺序有明确肯定时,是非常重要的。这个特性只可用于属于键的一部分的标量属性。序数不需要是连续的,它们只指定了元数据中键属性的相对顺序。

在理想情况下,我们想要能够作为KeyAttribute的一部分,通过一个 “Ordinal” 属性来指定键的顺序,但我们在下一个.NET框架版本之前不能对KeyAttribute做改动。

新的数据注释特性

虽然现有的数据注释特性在定义模型时提供了许多有用的选项,但还有几个常见的情形,我们想要能够使用注释特性来对模型做改动。就Code First中的数据注释支持而言,我们的目标不是要提供另一种能完全指定一个模型的方式,而是提供一种机制,可以应付开发人员需要影响模型的大多数常见配置的问题。

这正是非常想要得到大家早期反馈的一个方面,这样我们可以将你的想法融入我们的数据注释计划,下面是我们目前提议的针对Code First的几个注释特性。

RelatedToAttribute

RelatedToAttribute可用于做两件事:

  • 在内置的约定无法检测出来的情形下,对某些关系指定其双向性(bi-directionality)。
  • 将一个导航属性与它的外键做关联。

RelatedToAttribute可置于导航属性上,可以位于一个关系的零端,一端,或两端。RelatedToAttribute上有几个参数:

  • 可以指定目标类型上的 RelatedProperty
    这是用于支持关系的双向性(例如,Book.Author 与 Person.Books的关联性)。
  • 用于指定当前实体上对这个关系有所约束的键的属性。
    这可以是主键(如果该特性位于一个关系的主要端的导航属性上的话),或者是外键(如果该特性位于一个关系的依赖端的导航属性上的话)。
  • 用于指定相关联的实体上对这个关系有所约束的键的属性。
    这可以是主键(如果该特性位于一个关系的依赖端的导航属性上的话),或者是外键(如果该特性位于一个关系的主要端的导航属性上的话)。
  • 用于指定级联删除行为的属性。
    在这个属性被设置为true时,当主要实体被删除时,该关系的依赖端的实体也会被删除。

在本贴的开始时的例子中,RelatedToAttribute用于关联Book.Author 和 Person.Books导航属性,结果是,Book.AuthorSSN, Book.Author, 和 Person.Books都代表了模型中的同一个关系。

我们还在考虑使用现有的AssociationAttribute来指定关系。但这个属性假定了已有一个支持(backing)模型,要求有一个关系名以及必需的键属性,这在使用Code First描述你的模型时是不需要的。

LengthAttribute

LengthAttribute可用于指定数组类型(譬如byte[])的最大长度,只可用于属性。‘-1’ 值意味着“max”(最大值),其它的负值是不允许的。这跟StringLengthAttribute有所重叠,当 LengthAttribute在一个类型是字符串的属性上指定时,其语义与StringLengthAttribute相同。

StoreGeneratedAttribute

StoreGeneratedAttribute用于指定一个属性的值是在数据库储存端生成的,在第一个版本中唯一支持的储存生成模式是“identity”。这个特性只可用于属性,它还有一个可选的可null的boolean属性 IdentityIdentity是null值的话,意味着对Identity没有定论:需要通过约定或显式的API调用来决定是否启用identity模型。

StoreNameAttribute

StoreNameAttribute可用于指定储存或数据库项的名称。取决于该特性所施用的东西,这个特性可以有不同的含义:

  • 如果该特性是在一个上下文类上,它意味着“数据库名”
  • 如果该特性是在一个实体类上,它意味着“数据表名”
  • 如果该特性是在实体类中的属性上,它意味著“字段名”

StoreIgnoreAttribute

StoreIgnoreAttribute可以用于指定,当从一个CLR类型中读取类型或属性元数据时,不该包括某个CLR类型或属性。当该特性用于类时,意味着这些类不应该当作EntityType 或 ComplexType来考虑,当该特性用于属性时,意味着该属性不应该是EntityType 或 ComplexType的一部分。我们还没有最后确定该特性的名称,如果你有什么建议的话,请告诉我们。

StoreInlineAttribute

StoreInlineAttribute可用于指定,在从CLR类型中读取类型元数据时,某个CLR类型应该当作ComplexType来考虑。复杂类型可以被想成是没有identity或键的类,或是是属性的逻辑集合(譬如地址或电话),只可用于类定义。ComplexType是与实体同时保存的。我们也许会选择不包括这个特性,因为我们正想加到 Code First中去的约定应该能检测出大多数使用复杂类型的场合。

其它的可能性

你也许还有一些想使用数据注释特性来实现的另外种类的模型定义。其中一些是:

  • 能够指定字符串是否是unicode
  • >能够指定某个类型的长度是可变的还是固定的
  • 通过数据注释特性将CSDL注释加到模型中,这样其他系统(譬如OData)可以读取。这个特性的一个例子是RangeAttribute。

    如果你觉得这里边某些选项中听上去很有趣,或者你有想要我们考虑的另外的东西的话,请告诉我们。

    结语

    Code First将提供几种不同的方式来配置一个模型:完全通过内置的约定,使用数据注释特性做某些模型变动,或者通过使用流畅API来完全定制模型。为了在现有的数据注释特性之上提供更多的灵活性,我们将添加一些可为Code First所使用的新特性。

    我们希望就目前的特性集以及Code First该如何使用它们等方面听到你的反馈。

    Jeff Derstadt
    实体框架开发团队



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Friday, October 08, 2010  |  From

【原文地址】Conventions for Code First
【原文发表日期】 1 Jun 2010 1:03 PM

 

最新的Code First预览版允许你使用C# 和 VB.Net类来描述模型。模型的基本形态是通过约定(convention)推断出来的,然后可以用流畅API(fluent API)来进一步改善你的模型。

最近我们在博客中提到 计划支持数据注释,将其作为另一种描述你的模型的方式。我们正在研究如何扩展和改进最初推断出模型形态的约定。本贴将描述我们计划包括的约定。

约定是设计来给模型提供一个起始点,然后数据注释或流畅API可以用来进一步描述模型,或者改变由约定推断出的东西。配置的优先权次序为,流畅API,然后是数据注释,然后是约定。

主键

在以前,Code First会将一个属性推断为主键,假如这个属性是叫‘Id’ 或者 ‘<类名>Id’的话。对这个约定的唯一变化是,一旦推出主键后,如果它们的类型是‘int’, ‘long’ 或r ‘short’,它们会在数据库中默认注册为identity字段。主键的检测是无关大小写的。

关系的倒转(Inverse)

在两个类型间定义关系时,通常会在这两个类型上同时包括导航(navigation)属性,譬如下面这个例子:

<o:p>

public class Product<o:p></o:p>

{<o:p></o:p>

    public int ProductId { get; set; }<o:p></o:p>

    public string Name { get; set; }<o:p></o:p>

    public Category Category { get; set; }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

public class Category<o:p></o:p>

{<o:p></o:p>

    public int CategoryId { get; set; }<o:p></o:p>

    public string Name { get; set; }<o:p></o:p>

    public ICollection<Product> Products { get; set; }<o:p></o:p>

}<o:p></o:p>

 

</o:p>

 

在以前,Code First会在Product 和 Category之间创建2个单独的关系,但现在会推断出 Product.Category 和 Category.Products表示同一个关系的不同端。但这样的关系倒转的检测,只有在参与关系的两个类只定义了相对于对方的唯一一个导航属性(引用或集合)时才会发生。如果参与关系的一个类定义了2个或多个引用另一个类的导航属性的话,倒转关系的检测不会发生,象这样的关系需要使用 数据注释 或流畅 API手工配置。

外键

建立在以前的约定之上,通常也会在一个关系的依赖端包含一个外键属性,譬如下面这个例子中的BookReview.SubjectISBN:

 

 

<o:p></o:p>

public class BookReview<o:p></o:p>

{<o:p></o:p>

    public int Id { get; set; }<o:p></o:p>

    public Book Subject { get; set; }<o:p></o:p>

    public string SubjectISBN { get; set; }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

public class Book<o:p></o:p>

{<o:p></o:p>

    [Key]<o:p></o:p>

    public string ISBN { get; set; }<o:p></o:p>

    public string Name { get; set; }<o:p></o:p>

    public ICollection<BookReview> Reviews { get; set; }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

Code First现在会推断出,任何属性,假如它的名称是 ‘<导航属性名><主键属性名>’ (即 SubjectISBN), ‘<主要类名><主键属性名>’ (即 BookISBN) 或 ‘<主键属性名>’ (即 ISBN), 而且与主键拥有同样的数据类型,那么就代表了某个关系的外键。如果多个属性符合这样的条件的话,那么其优先权的先后就按上面列出的次序。外键的检测也是无关大小写的。

当检测出一个外键属性时,Code First 也会根据外键的可null性(nullability),推断出关系的多重性(multiplicity)。如果关系是可null的,那么关系会被注册为可选的(optional),否则的话,关系就是必需的,同时还会启用级联删除(cascade delete)。通过约定检测出的多重性和级联删除行为可使用流畅API来改变。

类型发现

在以前,Code First只会包括声明在上下文继承类上的对象集的类型,或者通过流畅API手工注册的类型。给定下面这个例子,那么Product会包括在你的模型中,而Category则不会:

 

 

<o:p></o:p>

public class ProductContext : ObjectContext<o:p></o:p>

{<o:p></o:p>

    public ProductContext(EntityConnection connection)<o:p></o:p>

        : base(connection)<o:p></o:p>

    { }<o:p></o:p>

<o:p> </o:p>

    public ObjectSet<Product> Products<o:p></o:p>

    {<o:p></o:p>

        get { return base.CreateObjectSet<Product>(); }<o:p></o:p>

    }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

public class Product<o:p></o:p>

{<o:p></o:p>

    public int Id { get; set; }<o:p></o:p>

    public string Name { get; set; }<o:p></o:p>

    public Category Category { get; set; }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

public class Category<o:p></o:p>

{<o:p></o:p>

    public int Id { get; set; }<o:p></o:p>

    public string Name { get; set; }<o:p></o:p>

    public ICollection<Product> Products { get; set; }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

Code First现在会察觉到Product有一个引用Category的属性,会自动将Category包括在你的模型中。可达性(Reachability)是递归式的,所以,如果Category也引用了一个未注册的类型的话,该类型也会被包括在模型中。可达性也会追随引用,到定义在另一个程序集中的类型上。约定也许会包括不属于模型的类型,这些类型可以通过StoreIgnore数据注释或流畅API来去除,例如:

 

 

<o:p></o:p>

var builder = new ContextBuilder<ProductContext>();<o:p></o:p>

builder.Ignore<Category>();<o:p></o:p>

复杂类型(complex type)的发现

建立在可达性约定之上,如果Code First发现一个类定义中无法推断出主键,也没有通过数据注释或流畅API来注册主键,那这个类型就会自动注册为复杂类型。复杂类型的检测也会要求该类型没有引用实体类型的属性,也没有为另一个类型中的集合类型中所引用。给定下面的类定义,Code First 会推断出 Name 是一个复杂类型, 因为它没有主键:

 

 

<o:p></o:p>

public class Person<o:p></o:p>

{<o:p></o:p>

    public int PersonId { get; set; }<o:p></o:p>

    public Name Name { get; set; }<o:p></o:p>

}<o:p></o:p>

<o:p> </o:p>

public class Name<o:p></o:p>

{<o:p></o:p>

    public string Title { get; set; }<o:p></o:p>

    public string FirstName { get; set; }<o:p></o:p>

    public string LastName { get; set; }<o:p></o:p>

}<o:p></o:p>

结语

Code First将提供一个扩展了的默认约定集来决定一个模型的形态。这些约定可以使用数据模型来重新定义,转而可以通过流畅API来否决。

我们希望听到你对这些约定以及对每个约定的相关规则的任何反馈。

Rowan Miller
ADO.Net实体框架开发团队的Program Manager



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Sunday, October 03, 2010  |  From

【译注】【时隔一年,Code First有了很大的变化, 期待着它的正式发布。】

【原文地址】EF Feature CTP4 Walkthrough: Code First
【原文发表日期】 14 Jul 2010 9:33 AM

简介

我们最近发布了实体框架特性社区技术预览版4(CTP4)。特性CTP4包含了我们考虑将来要加到核心框架中去的新特性的预览,希望得到社区的反馈。Feature CTP4是建立在随 .NET框架4.0 and Visual Studio 2010一起发布的实体框架4(EF4)的现有功能之上的.

这个贴子将提供对实体框架Code First(代码优先)特性的基本组件的示范,同时也包含在这个CTP4中的生产力改进方面的工作,则提供了一个流线型的Code First体验,通过提供一个建立在本贴中描述的构件块之上的外观(façade),将减小你所需编写的代码量。这个体验将在我们的CTP4生产力改进示范贴子中讨论。

如果你需要有关CTP4方面的帮助的话,请访问我们的实体框架预发布论坛

1. 安装EF CTP4

如果你还没有安装的话,那么你需要先安装实体框架特性CTP4

2. 创建应用

为了简单起见,我们将建造一个基本的console应用,使用Code First操作数据访问。

·        打开Open Visual Studio 2010

·        文件 -> 新 -> 项目…

·         从左边菜单中选择“Windows”,然后选择 “Console Application”

·         键入“EF.CodeFirst.Walkthrough” 作为其名称

·         点击“OK”

3. 创建模型

Code First说白了就是用类来描述我们的模型,因此我们一开始将在代码中构造出一个简单的模型。我们想要我们的模型是持久透明的( persistence ignorant),即,对实体框架没有任何的依赖性,因此我们将把我们的模型加到另一个项目中去。

·        给模型加一个新项目

o  文件 -> 添加 -> 新项目…

o  在左边菜单选择 “Windows”,然后选择“Class Library”

o  键入“EF.CodeFirst.Walkthrough.Model” 作为其名称

o  点击“OK”

·        在模型项目上右击,添加一个名为 “Book” 的类,其实现如下:

using System;

<o:p> </o:p>

namespace EF.CodeFirst.Walkthrough.Model

{

    public class Book

    {

        public string ISBN { get; set; }

        public string Title { get; set; }

        public DateTime FirstPublished { get; set; }

        public bool IsFiction { get; set; }

<o:p> </o:p>

        public virtual Publisher Publisher { get; set; }

        public virtual Author Author { get; set; }

    }

}

<o:p> </o:p>

·        在模型项目上右击,添加一个名为 “Person” 的类,其实现如下:

 

namespace EF.CodeFirst.Walkthrough.Model
{

    public class Person

    {

        public int PersonId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

    }

}

<o:p> </o:p>

·         在模型项目上右击,添加一个名为 “Author” 的类,其实现如下:

using System.Collections.Generic;

<o:p> </o:p>

namespace EF.CodeFirst.Walkthrough.Model

{

    public class Author : Person

    {

        public int AuthorId { get; set; }

<o:p> </o:p>

        public virtual ICollection<Book> Books { get; set; }

    }

}

<o:p> </o:p>

·        在模型项目上右击,添加一个名为 “Publisher” 的类,其实现如下:

using System.Collections.Generic;

<o:p> </o:p>

namespace EF.CodeFirst.Walkthrough.Model

{

    public class Publisher

    {

        public int PublisherId { get; set; }

        public string Name { get; set; }

<o:p> </o:p>

        public virtual ICollection<Book> Books { get; set; }

    }

}

4. 模型构造器和流畅 API

如果你用过Code First的以前CTP版本的话,那么从这里开始,会有点不一样了。就象ModelBuilder这名称蕴含的,ModelBuilder 是用来配置模型的,然后它会产生一个不可变的DbModel,该DbModel会被用来构建ObjectContext 或 DbContext实例。

一旦创建 DbModel 之后,该对象应该缓存起来,在你整个应用中重用,以避免多次创建模型会造成的性能问题。如果你采用在生产力改进示范一贴中描述的Code First方法的话,那么DbContext会为你负责这个缓存。

·         首先我们需要在我们的主应用中引用我们的模型

o   在console应用项目上右击 -> 添加引用…

o   选择“项目”页

o   从列表中选择模型项目

o   点击 “OK”

·         我们还需要引用CTP4程序集已经核心的实体框架程序集

o  在console应用项目上右击,-> 添加引用…

o   选择 “.NET” 页

o   从列表中选择S“Microsoft.Data.Entity.Ctp”

o   点击“OK”

o   重复上述步骤,添加对“System.Data.Entity”的引用

·         我们还需要在Program.cs的顶部加几个using语句

using System.Data.Entity.ModelConfiguration;

using System.Data.SqlClient;

using EF.CodeFirst.Walkthrough.Model;

<o:p> </o:p>

·         接着在Program.cs的Main方法中加入下面的代码来配置你的模型

static void Main(string[] args)

{

    var builder = new ModelBuilder();

           

    builder.Entity<Book>().HasKey(b => b.ISBN);

    builder.Entity<Book>().Property(b => b.Title).IsRequired();

    builder.Entity<Book>().HasRequired(b => b.Author).WithMany(a => a.Books);

<o:p> </o:p>

    builder.Entity<Person>();

<o:p> </o:p>

    builder.Entity<Publisher>().Property(p => p.Name).IsRequired().HasMaxLength(50);

}

<o:p> </o:p>

注:在最后一节中,我们将讨论创建一个继承的上下文,呈示你的模型中的类型集。一旦你有一个继承的上下文后,你可以使用ModelBuilder.DiscoverEntitiesFromContext(Type contextType) 方法将呈示的类型集的类型自动为你注册,这避免了对不需要任何额外配置的类型的手工注册,譬如上面代码中的Person类。

为什么引入DbModel?

在先前的CTP中,ContextBuilder 基本上做了ModelBuilder 和 DbModel两者的活。对最后的模型引进一个单独的表示(representation),确实在过程中添加了额外的步骤。但在将来,当我们寻找超越ModelBuilder的其他构造模型的方法时,DbModel对EF总的来说将变得更加的重要。DbModel允许我们对模型有一个单一的表示,可以用来构造ObjectContext和DbContext实例。

约定

你会注意到,我没有指定与模型相关的许多东西,例如,Person.PersonId是个主键或者Book.Publisher于Publisher.Books是同一个关系的倒转导航属性。这是因为Code First现在包含了广泛的约定,会为你处理常见的配置任务。这些约定在约定设计博客贴子中有详述。CTP4中包含的约定有:

  • 主键
  • 关系倒转(Relationship Inverse)
  • 外键
  • 数据表面的复数化

你通过流畅API明确指定的配置优先于通过约定发现的配置。

数据注释(Data Annotations)

Code First现在还支持数据注释,因此,我们可以不用通过流畅 API来配置Book.ISBN为主键,而可以在ISBN属性上加一个Key特性(System.ComponentModel.DataAnnotations.KeyAttribute)来实现。

数据注释在这篇设计博客贴子中有详细的论述。 CTP4中支持的注释有:

  • Key
  • StringLength
  • ConcurrencyCheck
  • Required
  • Timestamp
  • DataMember
  • RelatedTo
  • MaxLength
  • StoreGenerated

数据注释优先于约定,但通过流畅API明确指定的配置的优先权最高。

关系 (Relationship) API 变动

如果你用过Code First以前的CTP版本的话,你还会注意到我们改变了指定关系的句法,旨在使其更加直观。单一的Relationship方法现在为HasRequired, HasOptional 和 HasMany所替代。倒转的导航关系是通过WithRequired, WithOptional 和WithMany来指定的。如果在你的实体上呈示了外键的话,这些可以通过HasConstraint方法来配置。

这个重构的主要好处有:

  • 配置关系所需的方法调用数目减小了
  • API的签名更易理解
    • 单一Relationship方法,带多个引用和集合的重载,被证明很让人困惑难解
  • 除去了不合法的方法
    • 先前的 API 在关系的“多”一端呈示了Required 和Optional
  • 能够完全指定只呈示了一个导航属性的关系

以 Book和 Author之间的一对多关系为例,在以前,要这样来配置:



builder.Entity<Book>().Relationship(b => b.Author).IsRequired().FromProperty(a => a.Books);

<o:p> </o:p>

改动API之后,现在是这样配置:

 

builder.Entity<Book>().HasRequired(b => b.Author).WithMany(a => a.Books);

 

如果 Author.Books 属性不包含在模型中,现在还可能完全指定这样的关系:

 

builder.Entity<Book>().HasRequired(b => b.Author).WithMany();

 

或者,如果Book.Author属性没包含在模型中的话,

 

builder.Entity<Author>().HasMany(a => a.Books).WithRequired();

5. 配置类

现在,说我们想要把对Book的配置封装在另一个类中,我们可以通过给Book创建一个继承的配置类,然后将之与我们的模型构建器注册。这在你想要在一个应用中甚至多个应用间重用时会非常有用。配置类还很好地把与配置相关的代码与我们其他的应用代码分离开来了。

·         在console应用项目上右击,添加一个名为“BookConfiguration”的类,其实现如下:

using System.Data.Entity.ModelConfiguration;

using EF.CodeFirst.Walkthrough.Model;

<o:p> </o:p>

namespace EF.CodeFirst.Walkthrough

{

    public class BookConfiguration : EntityConfiguration<Book>

    {

        public BookConfiguration()

        {

            this.HasKey(b => b.ISBN);

            this.Property(b => b.Title).IsRequired();

            this.HasRequired(b => b.Author).WithMany(a => a.Books);

        }

    }

}

<o:p> </o:p>

·         然后我们可以将Program.cs中的Main方法修改成:

static void Main(string[] args)

{

    var builder = new ModelBuilder();

<o:p> </o:p>

    builder.Configurations.Add(new BookConfiguration());

<o:p> </o:p>

    builder.Entity<Person>();

<o:p> </o:p>

    builder.Entity<Publisher>().Property(p => p.Name).IsRequired().HasMaxLength(50);

}

6. 创建一个上下文继承类

至此,我们配置了我们的模型,与类做交互最容易的方式是通过一个上下文的继承类。随着我们上文提到的生产力改进(Productivity Improvements)的引进,这里有2个选项。你可以继承自我们现有的ObjectContext 类型或者新的选项DbContext类型,DbContext的API表面比较简单些。在本文中,我们对两个选项都来看一下。

6.1. 第一个选项: ObjectContext

·         在console应用项目上右击,添加一个名为“BookCatalog”的类,其实现如下:

using System.Data.EntityClient;

using System.Data.Objects;

using EF.CodeFirst.Walkthrough.Model;

<o:p> </o:p>

namespace EF.CodeFirst.Walkthrough

{

    public class BookCatalog : ObjectContext

    {

        public BookCatalog(EntityConnection connection)

            : base(connection)

        { }

<o:p> </o:p>

        private ObjectSet<Book> _books;

        public ObjectSet<Book> Books

        {

            get

            {

                return this._books == null

                    ? this._books = this.CreateObjectSet<Book>()

                    : this._books;

            }

        }

<o:p> </o:p>

        private ObjectSet<Person> _people;

        public ObjectSet<Person> People

        {

            get

            {

                return this._people == null

                    ? this._people = this.CreateObjectSet<Person>()

                    : this._people;

            }

        }

<o:p> </o:p>

        private ObjectSet<Publisher> _publishers;

        public ObjectSet<Publisher> Publishers

        {

            get

            {

                return this._publishers == null

                    ? this._publishers = this.CreateObjectSet<Publisher>()

                    : this._publishers;

            }

        }

    }

}

<o:p> </o:p>

·         定义完上下文继承类后,我们现在可以修改Program.cs的Main方法,用它来做数据访问:

static void Main(string[] args)

{

    var builder = new ModelBuilder();

    builder.Configurations.Add(new BookConfiguration());

    builder.Entity<Person>();

    builder.Entity<Publisher>().Property(p => p.Name).IsRequired().HasMaxLength(50);

<o:p> </o:p>

    var model = builder.CreateModel();

<o:p> </o:p>

    using (var connection = new SqlConnection(@"Server=.\SQLEXPRESS;Database=CodeFirstWalkthrough;Trusted_Connection=True;"))

    {

        using (var context = model.CreateObjectContext<BookCatalog>(connection))

        {

            if (!context.DatabaseExists())

            {

                context.CreateDatabase();

            }

<o:p> </o:p>

            var book = new Book

            {

                ISBN = "1111",

                Title = "Intro to Code First",

                FirstPublished = DateTime.Today,

                IsFiction = false,

                Author = new Author { FirstName = "Rowan", LastName = "Miller" },

                Publisher = new Publisher { Name = "EF Books" }

            };

<o:p> </o:p>

            context.Books.AddObject(book);

            context.SaveChanges();

        }

    }

}

<o:p> 

</o:p>

6.2.第二个选项: DbContext

我们将看一下如何从DbModel构造一个DbContext,但跟前面提到的那样,有一个更简单的Code First体验,可以避免在外部创建ModelBuilder 和 DbModel,而且还能负责模型缓存,这个体验在生产力改进示范有描述。

·        在console应用项目上右击,添加一个名为“SimpleBookCatalog”的类,其实现如下:

using System.Data.Entity;

using EF.CodeFirst.Walkthrough.Model;

using System.Data.Entity.Infrastructure;

<o:p> </o:p>

namespace EF.CodeFirst.Walkthrough

{

    public class SimpleBookCatalog : DbContext

    {

        public SimpleBookCatalog(DbModel model)

            : base(model)

        { }

<o:p> </o:p>

        public DbSet<Book> Books { get; set; }

        public DbSet<Person> People { get; set; }

        public DbSet<Author> Authors { get; set; }

        public DbSet<Publisher> Publishers { get; set; }

    }

}

<o:p> </o:p>

·         With a derived context defined we can now modify the Main method in Program.cs to use it for data access 定义了上下文继承类之后,我们现在可以修改Program.cs的Main方法,用它来做数据访问。
注意DbContext负责为我们创建数据库,所以我们不需要指定连接,这个约定是可以改写的,详细请参阅生产力改进示范

static void Main(string[] args)

{

    var builder = new ModelBuilder();

    builder.Configurations.Add(new BookConfiguration());

    builder.Entity<Person>();

    builder.Entity<Publisher>().Property(p => p.Name).IsRequired().HasMaxLength(50);

<o:p> </o:p>

    var model = builder.CreateModel();

<o:p> </o:p>

    using (var context = new SimpleBookCatalog(model))

    {

        var book = new Book

            {

                ISBN = "2222",

                Title = "Intro to Code First",

                FirstPublished = DateTime.Today,

                IsFiction = false,

                Author = new Author { FirstName = "Rowan", LastName = "Miller" },

                Publisher = new Publisher { Name = "EF Books" }

            };

<o:p> </o:p>

            context.Books.Add(book);

            context.SaveChanges();

    }

}

7. 结语

在这个示范中,我们看了一下如何使用最基本的Code First组件来配置一个模型,创建一个上下文做数据访问。我们看到了新引进CTP4中的扩展了的默认约定,数据注释和更新过的关系API等。

就象在本贴中提到的那样,这些构件块也可以用来提供一个更简单,也更流线型的Code First 体验,请参阅这个贴子中的生产力改进方面的工作

<o:p> 
</o:p>

Rowan Miller
Program Manager
ADO.NET Entity Framework



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Sunday, October 03, 2010  |  From

SharePoint 2010 提供了Site Workflow的支持,至此,SharePoint里的Workflow可以不用绑定到文档或者列表项目了。

image

image

这给SharePoint的Workflow的应用带来了更大的灵活度,能更好的和其他系统进行结合。

一般跟其他系统进行集成,Service接口是不可少的,SharePoint的Workflow.asmx Web服务是唯一的一个默认自带的跟Workflow有关的Web服务。

但是,SharePoint 2010的Workflow.asmx的Web服务没有提供对Site Workflow的支持。

如果你是SharePoint 2010开发人员,你可以开发一个自己的Site Workflow的Web服务,部署到SharePoint 2010上。

CodePlex上也有一个项目是提供这方面增强的:Useful SharePoint Site Workflow Utilities

Design.png



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Saturday, October 02, 2010  |  From

我们经常使用“保存为模板”(Save as Template)方法来导出列表设置和列表内容,然后恢复到其他SharePoint站点上(在下文中我们以“目标网站”来代表列表内容恢复的目标SharePoint站点)。

当列表中包含Lookup(查阅项)字段的时候,由模板创建列表后查阅项字段的设置和内容会丢失,当你查看查阅项字段的时候,你会发现:

image

查阅列表(Get Information from)为空……

解决方法1网上MVP给出解决问题的方法,List Template problems with look up columns:

因为列表模板时一个.stp文件,其实就是一个cab文件,把cab包解开以后,里面包含的是一个manifest.xml文件,里面定义了这个列表模板的字段和所有数据:

image

打开该xml文件,可以找到Lookup查阅项字段的定义:

image

Lookup查阅项类型的Schema里面有一个属性“List“,指定的就是查阅的列表的GUID,问题就出在这里,列表的GUID都是随机生成,目标网站肯定没有一个同一GUID的列表,所以设置的内容都会丢失。解决的方法就是将这个GUID更改成目标SharePoint网站上要查阅的列表的GUID。把manifes.xml文件更改完成后,用makecab manifest.xml [templatename].stp方法把修改后的xml文件打包到stp文件中,上传到目标网站,即可顺利使用模板把列表和内容创建出来。

<fieldset><legend>解决方法1的问题</legend>

1)如果是一个计算机水平一般的最终用户,让他/她查找列表GUID,用makecab方法来打包修改的xml文件,是个不太好的做法。但是,管理员没法事先知道查阅的列表在目标网站创建出来的GUID,所以管理员也没法事先把列表模板修正好,提供给用户。

2)如果这个列表查阅了列表本身,根本没法获取到这个GUID….

</fieldset>

最终的解决方法

1)仔细研究Lookup查阅项类型的Schema定义,你会发现“List”属性的定义可以使用列表的名称来取代GUID,这样我们的第一个问题就可以解决了:

举个例子,我们如果查阅的一个叫SourceList的列表,我们可以吧Lookup字段的定义更改成:

image

list属性的规则是“Lists\[列表名称]”

2)但是,如果是查阅了列表本身的话,上面的方法是不起作用的,“List”属性需要设置为“Self”,详细的解释我们可以参考:Lookup Fields to the Same List – Defined as a Site Column

好了,至此,包含Lookup查阅项字段的列表的导出成模板产生的问题就解决了。如果你觉得必要的话,可以写个简单的小工具来自动化这个过程……



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Friday, October 01, 2010  |  From

【原文地址】Pinning Projects and Solutions with Visual Studio 2010
【原文发表日期】 Monday, May 10, 2010 9:51 PM

这是我针对VS 2010 和 .NET 4所撰写的 贴子系列 的第二十四篇。

今天的贴子讨论VS 2010中一个很小,但依然很有用的特性,即将项目和方案“钉” 在Windows 7 任务栏和 VS 2010起始页上的功能,这可以方便在IDE中快速地发现和打开项目。

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

Windows 7 任务栏上的VS 2010 快捷清单(Jump List)

Windows 7中添加了在你的屏幕底部定制任务栏的支持,你可以在上面任意“钉住(pin)”或重新安排应用的图案。

大部分在Windows 7上使用 Visual Studio 2010 的开发人员大概已经知道他们可以在Windows 7任务栏上“钉住”Visual Studio图案,使之不消失。但你也许还没发现的是, Visual Studio 2010 也提供了一个任务栏“ 快捷清单”,你可以用来快速地发现和装载你最近使用过的项目。

要激活这个功能,只要在任务栏的VS 2010图案上右击,你就会看到你最近的项目。点击其中一个就会在Visual Studio 2010中装载起来:

image

在Windows 7中将项目钉在VS 2010快捷清单上

VS 2010还支持一个很好的特性,就是还可以将项目钉在快捷清单上,使之总是出现在清单的顶部。想启用的话,只要(将鼠标)悬浮于你想要钉住的项目之上,然后点击出现在其右边的“钉子”图案:

image

当你点击那个钉子时,对应的项目就会被加到快捷清单顶部的一个新的“钉住”列表中去了:

image

这允许你在清单的顶部总是显示你自己的项目清单。你也可以对其点击,拖拉成你想要的显示顺序。

Windows 7快捷清单很酷的键盘技巧

Scott Cate教了我一个很酷的技巧,就是不用鼠标,从键盘就能激活Windows 7快捷清单的功能。

只要按住Windows 键 + Alt键 + [任务图案所处的索引],快捷清单就会出现。例如,在上面,VS 2010是我机器上从左开始第四个程序图案,所以如果我同时按Windows 键 + Alt + 4,那么VS快捷清单就会出现。然后你可以使用键盘上的向上,向下箭头选择你想要从快捷清单上装载的项目。

VS 2010起始页和项目钉住

VS 2010在你每次启动新Visual Studio实例的时候,默认会显示一个“起始页(start page)”。除了显示学习和帮助资源外,它还包括了一个“最近项目”部分,你可以用来快速装载你最近工作过的项目:

image

起始页上的“最近项目”部分还支持这样一个概念,“钉住”你想要总是保持在列表中的项目的链接,不论这些项目被访问的最新时间是什么。

要把一个项目“钉在”这个列表中,你只要选择(鼠标)悬浮于列表中那个项目之上时出现的“钉子”图案即可:

image

一旦你将一个项目钉在了起始页清单上,它总会露面(至少直到你将其“拔掉(unpin)”为止)。

结语

VS 2010中这个项目钉住的支持虽小,但可用性很好,可以方便快速发现和装载项目和解决方案。如果你同个时间会操作多个项目,它提供了一个很好的捷径来装载这些项目。

希望本文对你有所帮助,

Scott



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Thursday, September 30, 2010  |  From

【原文地址】 Visual Studio 2010 Extension Manager (and the new VS 2010 PowerCommands Extension)
【原文发表日期】 Monday, May 03, 2010 10:34 PM

这是我针对VS 2010 和 .NET 4所撰写的 贴子系列 的第二十三篇。

今天的博客讨论VS 2010中所做的一些扩展性方面的改进, 以及微软刚发布的一个很酷的新“Visual Studio 2010 PowerCommands”扩展 (可以免费下载使用)。

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

VS 2010中的扩展性

VS 2010,较之于先前的版本,提供了更为丰富的扩展性模型。任何人都可以建造扩展,来对Visual Studio 2010 IDE,代码编辑器,项目系统和相关的设计器进行加强,定制和增添色彩。

VS 2010扩展可以使用内置于.NET 4中新的MEF (托管扩展性框架-Managed Extensibility Framework)来创建。你可以从 Visual Studio开发团队的博客这篇博客贴子中学习如何创建VS 2010扩展的细节。

VS 2010扩展管理器

建造扩展的开发人员可以自己发行这些扩展(通过自己的网站或出售)。

Visual Studio 2010现在还在IDE中包含了一个内置的“扩展管理器(Extension Manager)”,方便了开发人员在线寻找,下载和启用扩展。你可以通过工具->扩展管理器(Tools->Extension Manager)菜单选项来打开“扩展管理器”:

image

这会打开“扩展管理器”对话框,该对话框会访问居于微软的“在线陈列室”,然后填充你可以下载并在你的Visual Studio中启用的扩展的列表:

image

在线陈列室中已有几百个很酷的扩展。你可以按分类对它们进行浏览(使用左上角的树形视图来过滤)。点击任何一个扩展的“下载”按钮就启动下载,安装和启用的步骤。

Visual Studio 2010 PowerCommands扩展

这个周末,微软在在线陈列室中发布了免费的Visual Studio 2010 PowerCommands扩展。你可以在这里了解相关详情,可以通过上面的“扩展管理器”(查询 PowerCommands即可)下载和安装它。

PowerCommands扩展在Visual Studio 2010中添加了数十个有用的的命令。下面是它往解决方案管理器上下文菜单中添加的几个有用命令的屏幕截图:

image

下面是这个周末发布的Visual Studio 2010 PowerCommands扩展中包含的全部命令的列表:

  • Enable/Disable PowerCommands in Options dialog(在选项对话框中启用和禁止PowerCommands)
    这个特性允许你选择在Visual Studio IDE中启用哪个命令。指向工具菜单,然后点击选项。展开PowerCommands选项,然后点击Commands,对你想启用的命令打勾。
    注:所有的PowerCommands初始是默认启用的。

  • Format document on save / Remove and Sort Usings on save(在保存时格式化文档/对using语句进行删除和排序)
    保存时对文档进行格式化这个选项可以格式化被保存文档的tab,空格等等。这个命令等同于执行编辑菜单,单击高级选项,然后点击格式化文档。对using语句进行删除和排序选项在被保存的文档中删除未利用的using语句,对剩下的using语句进行排序。
    注: 对using语句进行删除和排序选项只限于C#文档。在保存时格式化文档/对using语句进行删除和排序这2个命令初始时默认为OFF。
  • Clear All Panes(清除所有方框)
    这个命令清除所有输出方框,可从输出窗口工具条上的按钮来执行。
  • Copy Path(拷贝路径)
    这个命令把当前选择的个项拷贝到剪贴板上。可以右击方案管理器中下述节点执行:
    方案节点; 项目节点; 任何项目个项节点; 任何目录节点。
  • Email CodeSnippet(邮寄代码片段)
    想邮寄在代码编辑器中被选中的文本,在编辑器中右击任何地方,然后点击Email CodeSnippet(邮寄代码片段)。
  • Insert Guid Attribute(插入Guid特性)
    这个命令在选中的类中加一个Guid特性,在代码编辑器中,在类的定义中右击任何地方,然后点击Insert Guid Attribute(插入Guid特性)。
  • Show All Files(显示所有文件)
    这个命令在方案节点被选中时,显示方案管理器中所有项目中隐藏的文件。它增强了Show All Files(显示所有文件)按钮,该按钮一般只显示选中项目节点中的隐藏文件。
  • Undo Close(取消关闭)
    这个命令重新打开一个被关闭的文档,将光标返回到最后的位置。要重新打开一个最后被关闭的文档,指向编辑菜单,然后点击Undo Close(取消关闭)。或者,你可以用 CtrlShiftZ 快捷键。
    要重新打开最近被关闭的其他文件,指向视图菜单,点击其他窗口,然后点击Undo Close Window(取消关闭窗口)。取消关闭窗口出现,一般是靠近输出窗口。双击列表中的任何文件,重新打开。
  • Collapse Projects(折叠项目)
    这个命令从被选中的根节点开始,折叠方案管理器中的一个项目或多个项目。将一个项目折叠可以增加方案的可读性。这个命令可从三个不同的地方执行:分别是方案节点,方案目录节点和项目节点。
  • Copy Class(拷贝类)
    这个命令将一个选中的类的全部内容拷贝到剪贴板上,并且重新命名类名。这个命令之后一般会接着执行Paste Class(粘贴类)命令,并且将类重新命名以免编译错误。可从单个项目个项或带着子个项(sub items)的项目个项(project item)执行。
  • Paste Class(粘贴类)
    这个命令从剪贴板处粘贴过来一个类的全部内容,将类重新命名以免编译错误。这个命令之前跟着Copy Class(拷贝类)命令执行的。可从项目或目录节点执行。
  • Copy References(拷贝引用)
    这个命令将一个引用或多个引用拷贝到剪贴板上。可以从总引用节点(references node),单个引用节点,或者多个引用节点执行。
  • Paste References(粘贴引用)
    这个命令从剪贴板处粘贴过来一个引用或多个引用。可根据项目类型,从不同的地方执行。对C#项目,可从总引用节点执行。对Visual Basic 和 网站项目,可从项目节点执行。
  • Copy As Project Reference(拷贝为项目引用)
    这个命令将一个项目作为项目引用拷贝到剪贴板上,可从项目节点执行。
  • Edit Project File(编辑项目文件)
    这个命令打开Visual Studio中所选项目的MSBuild项目文件,它结合了现有的Unload Project(卸载文件)和Edit Project(编辑项目)命令。
  • Open Containing Folder(打开父目录)
    这个命令打开一个Windows资源管理器窗口,指向所选项的物理路径,可从项目个项(project item)节点执行。
  • Open Command Prompt(打开命令行)
    这个命令打开一个 Visual Studio 命令行,指向所选项的物理路径,可从4个地方执行,分别是解决方案节点,项目节点,目录节点和个项(item)节点。
  • Unload Projects(卸载项目)
    这个命令卸载一个解决方案中的所有项目。这在MSBuild有多个项目正被编辑的场景中会非常有用。这个命令可从方案节点执行。
  • Reload Projects(重新装载项目)
    这个命令重新装载一个解决方案中所有卸载了的项目,可从方案节点执行。
  • Remove and Sort Usings(对using进行删除和排序)
    这个命令对给定项目中所有类中的using语句进行删除和排序。例如,对由向导(wizard)生成的using语句进行删除或组织是非常有用的。这个命令可以从一个方案节点或单个项目节点来执行。
  • Extract Constant(提取常数)
    这个命令针对所选择的文本创建一个常数定义语句。有效地提取常数,对一个明文值命名,能提高可读性。这个命令可以在代码编辑器中,通过右击选择的文本来执行。
  • Clear Recent File List(清除最新文件列表)
    这个命令清除Visual Studio的最新文件列表,该命令调出一个清除文件对话框,允许选择任何一个或所有最新的文件。
  • Clear Recent Project List(清除最新项目列表)
    这个命令清除Visual Studio的最新项目列表,该命令调出一个清除文件对话框,允许选择任何一个或所有最新的项目。
  • Transform Templates (转换模板)
    这个命令执行与文本模板项相关的定制工具,可以从DSL项目节点或DSL目录节点执行。
  • Close All (全部关闭)
    这个命令关闭所有文档,可以从文档页(tab)执行。

如何临时禁止扩展

扩展提供了一个可以增强Visual Studio之威力的极好方式,可以帮助提高你总的生产力。但要记住的一件事是,扩展是在Visual Studio进程(DevEnv.exe)中运行的,所以,扩展中的缺陷会影响Visual Studio的稳定性和性能。

如果你在任何时候遇上这样的情景,IDE看上去比较慢,或者一再崩溃,务请临时禁止任何安装的扩展,看是否能解决问题。 针对通过在线陈列室安装的扩展,你可以重新运行扩展管理器(使用工具->扩展管理器菜单项),然后选择对话框左上角的“安装的扩展”节点,然后点击你安装列表中任何一个扩展处的“禁止”按钮即可:

image

希望本文对你有所帮助,

Scott



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Thursday, September 30, 2010  |  From

【原文地址】 Box Selection and Multi-Line Editing with VS 2010
【原文发表日期】 Monday, April 26, 2010 5:53 PM

这是我针对VS 2010 和 .NET 4所撰写的 贴子系列 的第二十二篇。

我已经讨论过VS 2010发布中一些代码编辑器方面的改进。具体来说,我讨论过代码Intellisens方面的改进, 新的代码的查询和导航特性, HTML, ASP.NET 和JavaScript代码片段支持, 以及 改进了的JavaScript Intellisense。今天的博客讨论VS 2010中一个很小,但很棒的编辑器方面的改进,即使用“框式选择(Box Selection)”进行多行编辑的功能。这可以免除击键次数,促成一些非常之牛的编辑场景。

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

框式选择(Box Selection)

框式选择这个特性在Visual Studio中存在已经有段时间了 (虽然知道的人并不多)。它允许你在代码编辑器里,在使用鼠标选择文字区域的同时按下ALT键,来选择一个矩形的文字区域。如果是在 VS 2008中,那么你接着可以拷贝或删除所选文字。

VS 2010现在用框式选择促成了更多的功能,包括:

  • 文字插入: 用框式选择键入文字的话,现在允许你在选择的每个行上插入新文字
  • 粘贴/替换: 你现在可以把一个框式选择的内容粘贴到另一个框中去,让内容正确地流动
  • 零长度的框: 你现在可以做一个垂直的0字符宽度的选择,创建一个多行的插入点,用于键入新的或粘贴拷贝的文字

这些功能在多种场景中都会非常有用。其中一些场景例子包括, 改变访问修饰符(private->public),在多行上添加注释,设置多个字段,或将多个语句组合在一起等。

精彩的三分钟框式选择录像示范

Visual Studio编辑器开发团队的Brittany Behren有一个精彩的3分钟长的录像,展示VS 2010中使用框式选择的几个很酷的多行代码编辑场景(注:开启你的喇叭,因为示范是有声音的):

 

观看一下,学几种你可以使用这新的框式选择功能来在VS 2010中更进一步优化键盘输入的方式。

希望本文对你有所帮助,

Scott

【附注】 你可以通过订阅Visual Studio开发团队的博客 或在推特上追随 @VSEditor 来了解VS编辑器的详情。



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Thursday, September 30, 2010  |  From

【原文地址】 VS 2010 Debugger Improvements (BreakPoints, DataTips, Import/Export)
【原文发表日期】 Wednesday, April 21, 2010 4:43 PM

这是我针对VS 2010 和 .NET 4所撰写的 贴子系列 的第二十一篇。今天的博客讨论VS 2010调试器可用性方面若干很棒的改进。

VS 2010调试器有成堆的新功能。象Intellitrace(也称为历史调试),新的平行/多线程调试功能, 以及 转储(dump)调试支持这样的特性在大家谈论这个版本中调试方面的改进时,往往得到更多的(也是非常应得的)关注。我会在将来的博客中示范如何利用这些新的特性。

但在今天的贴子中,我想我先讨论包括在VS 2010发布中的几个小的,但非常棒的调试器可用性方面的改进,我想你会发现它们非常地有用。

断点标签(Breakpoint Labels)

VS 2010包含了一些新支持,以便更好地管理调试器断点,一个特别有用的特性叫做“断点标签”,它促成了对一个项目中或跨越解决方案的断点的更好的分组和过滤功能。

在以前的Visual Studio版本中,你只能把每一个调试器断点当作单独一项来管理。单独管理每个断点会很痛苦,特别是在大项目中,在你想要维护断点的“逻辑组”,你可以根据你正在调试的东西启用或中止它们的情形下。使用VS 2010中新的“断点标签”特性,你现在可以对这些断点“分组”命名,将它们作为一个单元来管理。

使用标签将多个断点组合在一起

下面是Visual Studio 2010中断点窗口的一个屏幕截图,它列出了我解决方案(是ASP.NET MVC 2代码库)中所有的断点:

image

上面列表中的第一个和最后一个断点在控制器(Controller)实例被ASP.NET MVC 框架创建或释放时会断入调试器。

使用VS 2010, 我现在可以选择这2个断点,右击,然后选择新的“编辑标签。。。”菜单命令,给它们一个常见的标签/名称(使之方便查询和管理):

image

下面是当我选择“编辑标签。。。”命令时出现的对话框。我们可以用它来为我们的断点创建一个新的字符串标签,或者选择一个我们已经定义好的现成标签。在这个情形中,我们将创建一个名为“Lifetime Management(生命期管理)”的新标签,描述这2个断点涵盖的范围:

image

当我们点击OK按钮时,我们的2个被选中的断点就被归于新创建的“Lifetime Management”标签之下了:

image

按标签对断点进行过滤/排序

我们可以使用“Search (查询)” 组合框,快速地按标签对断点进行过滤和排序。在下面,我们只显示了那些属于“Lifetime Management” 标签下的断点:

image

按标签启用或中止断点

我们还可以按标签群启用或中止断点。我们只要按标签群过滤,按Ctrl-A 选择所有的相关断点,然后一个点击就可以启用或中止所有的断点:

image

导入/导出断点

VS 2010现在支持将断点导入或导出到XML文件,然后你可以将文件传给另一个开发人员,附加到缺陷报告中,或者只是之后重新装载到IDE中去。

如果只导出部分断点,你可以用特定的标签作过滤,然后在断点窗口点击“导出断点”:

image

在上面我将我的断点列表做了过滤,只导出2个特定的断点(特定于我正在追寻的一个缺陷)。我可以将这些断点导出到一个XML文件,然后将其附加到一个缺陷报告或email,允许另一个开发人员在另一台机器上轻松地将调试器配置到正确的状态,开始调查其究竟。

钉住的数据提示(Pinned DataTips)

Visual Studio 2010还包含一些新的“数据提示钉住”特性,允许你在调试器中时更好地查看和跟踪变量和表达式的值。

只要在调试器中,(将鼠标)悬浮于变量或表达式之上,显示其数据提示(DataTip),那是个显示其值的小工具提示(tooltip),然后点击上面的新的“图钉”按钮,使数据提示不消失:

image

你可以在屏幕上“钉住”任意数目的数据提示。除了钉住顶层的变量外,你还可以钻入变量的子属性,将它们也钉住。

在下面,我“钉住”了三个变量: “category”, “Request.RawUrl” 和 “Request.LogonUserIdentity.Name”,注意后面2个变量是 “Request”对象的子属性。

image 

将注释与钉住的数据提示相关联

(将鼠标)悬浮于一个钉住的数据提示之上,会在调试器中显示一些额外的界面:

image

点击这个界面上最下面的注释按钮,会展延该数据提示, 允许你添加相关注释:

image

这极大地方便了附加和跟踪调试备注:

image

钉住的数据提示可以跨越调试会话(Session)和Visual Studio会话(Session)

钉住的数据提示可以跨越多个调试器会话来使用。这意味着如果你中止了调试器,做了代码改动,然后重新编译,开始一个新的调试会话时,任何钉住的数据提示还在那里,以及你附加的任何注释。

钉住的数据提示还可以跨越多个Visual Studio会话来使用。这意味着,如果你关闭了项目,退出了Visual Studio,之后你又将项目打开,任何钉住的数据提示还在那里,以及你附加的任何注释。

查看上个调试会话中的数值(非常棒的代码编辑器特性)

有过多少次,你中止了调试器,结果又回到你的代码,气恼地说,

$#@! 哎,那个变量的数值是什么来着?

钉住的数据提示有一个很好的属性,就是它们记住“调试器会话”中最后那个数值,你可以在VB/C# 代码器中查看这些值,即使调试器不在运行了

当你在代码编辑器中,调试器不在运行时,数据提示默认是隐藏的。但在代码编辑器的左手的边缘,对每一个你先前设置好的数据提示,你都可以找到一个钉子:

image

将你的鼠标悬浮于一个钉住的数据提示之上时,会导致那个钉子显示在屏幕上。在下面,你可以看到当我悬浮于编辑器中第一个钉子时,它会显示我们上个调试会话中“Request”对象数据提示的值以及我们附加的相关注释:

image

当你在代码编辑模式和调试模式之间切换时,这可以极大地方便记录状态和条件。

导入/导出钉住的数据提示

就象我在本贴前面提到的,钉住的数据提示默认是跨越 Visual Studio 会话保存的(你不用做什么就可以)。

VS 2010现在还支持将钉住的数据提示导入或导出到XML文件,然后你可以将文件传给另一个开发人员,附加到缺陷报告中,或者只是之后重新装载到IDE中去。

image

连同新的断点导入/导出支持,这极大地方便了多个开发人员分享调试器配置,并且做跨越调试会话的合作。

结语

Visual Studio 2010包含了一堆很棒的新调试器特性,有大的,也有小的。

今天的博客分享了调试器可用性方面一些很棒的改进。上面所有的特性在Visual Studio 2010专业版都有支持(其中的钉住的数据提示(Pinned DataTip)特性在免费的Visual Studio 2010 Express版中也有支持)。

在将来的博客中,我还会讨论一些“非常大的(big big)”新调试特性,象 Intellitrace, 平行/多线程调试,转储文件(dump file)分析等。

希望本文对你有所帮助,

Scott

【附注】 【除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Thursday, September 30, 2010  |  From

【原文地址】 JavaScript Intellisense Improvements with VS 2010
【原文发表日期】 Thursday, April 08, 2010 11:56 PM

这是我针对即将发布的VS 2010 和 .NET 4所撰写的 贴子系列的第二十篇。

今天的博客贴子讨论VS 2010 和免费的 Visual Web Developer 2010 Express版本中一些JavaScript intellisense方面很棒的改进。你会发现在VS 2010中对大脚本文件和大脚本库,JavaScript Intellisense装载快多了,而且它现在跟早期的Visual Studio版本相比,对更多的高级场景提供了语句完成支持。

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

改进了的JavaScript Intellisense

为象JavaScript这样的动态语言提供Intellisense比一个象VB或C#这样的静态类型的语言更为麻烦,要正确地推断变量,方法等的形状和结构,不赝执行(pseudo-executing)实际代码本身几乎是不可能的,因为JavaScript作为语言足够灵活,可以在运行时动态地修改和变换(morph)这些东西。

VS 2010中的JavaScript代码编辑器现在拥有足够的智能在你键入字符的同时,进行这类的赝码执行(pseudo-code execution),那就是它的Intellisense完成保持正确和完整的机理。下面是一个简单的示范,展示其在最终版中的丰富性和灵活性。

第一个场景: 基本类型推断

当你在JavaScript中声明一个变量时,你不需要声明它的类型,变量的类型是基于赋予的值而定的。因为VS 2010在编辑器中赝执行代码(pseudo-executes the code),它能够动态地推断出变量的类型,基于赋给一个变量的值提供合适的代码intellisense。

例如,注意下面,VS 2010 提供了对应于字符串的语句完成提示(因为我们将一个字符串赋给了“foo”变量):

image

如果我们后来把一个数字赋给了 “foo” 变量,语句完成提示(在赋值完成之后)自动改成提供针对数字的intellisense:

image

第二个场景:操作浏览器对象是的Intellisense

在JavaScript中操作网页的DOM,以及操作客户端的浏览器对象,是经常性的事。

以前的Visual Studio版本会针对标准的浏览器对象提供JavaScript语句完成提示,但对更高级的场景(象创建动态变量和方法)没有提供什么帮助。VS 2010 在编辑器中的的代码赝执行(pseudo-execution of code)现在允许我们对更大范围的场景提供丰富的 intellisense。

例如,在下面,我们使用浏览器的 window 对象创建了一个名为“bar”的全局变量。注意我们后来试着使用该变量时,在VS 2010中是如何得到intellisense的(提供了针对字符串的正确类型推断):

image

当我们赋给“bar”变量一个数字 (而不是字符串) 时, VS 2010 intellisense引擎正确地推断出它的类型,把语句完成恰当地改成针对数字的提示了:

image

第三个场景: 炫耀一下

因为 VS 2010 在编辑器中赝执行代码,它能够处理一堆你扔给它的场景(既可以是实用的,也可以是古怪的),还能够提供准确的类型推断和intellisense。

例如, 在下面,我们使用了一个for循环和浏览器的window对象动态创建和命名多个动态变量,bar1, bar2, bar3…bar。注意编辑器的intellisense引擎是如何识别和为它们提供语句完成提示的:

image

因为通过浏览器的window对象添加的变量同时也是全局变量,它们现在还同时出现在全局变量intellisense下拉框中了:

image

更棒的是,类型推断依然是完全支持的。所以,如果我们将一个字符串赋给一个动态命名的变量,我们会得到字符串的类型推断。如果我们赋了一个数字,我们将得到数字的类型推断。

为好玩起见(也算炫耀吧!),我们可以调整我们的for循环,给偶数序的变量(bar2, bar4, bar6等)赋一个字符串,给奇数序的变量(bar1, bar3, bar5等)赋一个数字:

image

注意在上面我们的“bar2”变量得到了针对字符串的语句完成提示。

注意下面,对“bar1” ,我们得到了针对数字的语句完成提示:

image 

这可不仅仅是一个很酷的聚会游戏(party trick)。。。

虽然上面的例子有点人为性质,但在运行时动态创建变量,方法和事件处理器的做法在许多Javascript库中是常见的东西。许多流行的脚本库使用这些技术将脚本库的下载大小保持尽量的小。VS 2010对使用这些技术的脚本库的分析和赝执行确保你在对它们编程时即可(out of the box)就能得到更好的代码Intellisense。

结语

Visual Studio 2010 (以及免费的Visual Web Developer 2010 Express 版本)现在提供了极其丰富的JavaScript intellisense 支持。这个支持可用于几乎所有流行的JavaScript库,它应该在你的ASP.NET应用中编写客户端JavaScript以及启用AJAX场景时,帮助提供一个极好的开发体验。

希望本文对你有所帮助,

Scott

【附注】你可以阅读我先前关于VS 2008中JavaScript Intellisense的博客了解早期 JavaScript intellisense(以及它支持的一些场景)的详情。当然VS 2010依然支持VS 2008中启用的所有场景。



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Thursday, September 30, 2010  |  From

【原文地址】 New <%: %> Syntax for HTML Encoding Output in ASP.NET 4 (and ASP.NET MVC 2)
【原文发表日期】 Tuesday, April 06, 2010 11:57 PM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的VS 2010 和 .NET 4所撰写的 贴子系列的第十九篇。

今天的贴子讨论ASP.NET 4中引进的一个很小,但非常有用的新句法特性,即能自动到代码片段中对输出进行HTML编码的功能。这有助于保护你的应用和网站免受跨站脚本攻击(XSS)和HTML注入攻击,而且允许你使用一个非常简洁的句法来实现。

HTML编码

跨站脚本注入(XSS)和HTML编码攻击是网站和应用频受其害的2个最常见的安全问题。它们是在黑客找到方法,把客户端脚本或HTML标识注入网页,然后这些网页被访问网站的其他访问者浏览时发生的。这可以用来糟蹋一个网站,以及允许黑客运行客户端代码来偷窃cookie数据或者利用用户在网站上的身份做坏事。

帮助减少跨站脚本攻击的一个方法是确保网页上显示的输出是被HTML编码过了的,这帮助确保任何由终端用户输入或修改过的内容无法在向网页输出时含有象<script> 或 <img>这样的元素。

今天是如何对内容进行HTML编码的

ASP.NET 应用(特别是那些使用ASP.NET MVC的应用)经常依赖使用 <%= %> 代码片段表达式来显示输出。开发人员今天经常在这些表达式内使用Server.HtmlEncode() 或 HttpUtility.Encode()辅助方法在显示输出之前对输出进行HTML编码。这可以用象下面这样的代码来实现:

image

虽然这正常工作,但有2个小缺点:

  1. 有点冗长
  2. 开发人员经常忘了调用Server.HtmlEncode方法,而且没有简单的方法可以对整个应用来核实其用法

新的代码片段句法: <%: %>

在ASP.NET 4中,我们引进了一个新的代码表达式句法,<%:  %>,象<%= %>一样显示输出,但在显示前,会对输出自动进行HTML编码。这免掉了象上面例子那样显式地对内容进行HTML编码的需要,你只要编写象下面这样更为简洁的代码即可实现完全一样的事:

image

我们选择 <%: %> 句法,是因为很容易快速地替换现有的 <%= %> 代码段实例,它还允许你轻松地在你的代码库查询 <%= %> 元素,发现并核实任何你在应用中没有使用HTML编码的地方,以确保其行为之正确性。

避免双重编码

虽然对内容进行HTML编码通常是个好的最佳实践,但有时你输出的内容就是HTML或者已经编码过了,在这样的情形下,你不想要再做HTML编码。

ASP.NET 4 引进了一个新的 IHtmlString接口 (以及一个具体实现: HtmlString),你可以将其在类型上实现,来表示它的值用来显示HTML时,已经恰当地编码过了(或者已经检查过了),因此它的值不该再作HTML编码了。<%: %>代码片段句法会检查内中代码表达式的值是否实现了IHtmlString 接口,如果实现了的话,就不再对其输出进行HTML编码。这允许开发人员避免需要每每做决定是用<%= %> 还是用 <%: %>代码片段,而你总可以使用<%: %>代码片段,然后让已经HTML编码过了的任何属性或数据类型实现 IHtmlString接口。

在 <%: %> 中使用ASP.NET MVC HTML辅助方法

举一个这个HTML编码替换机制非常有用的实际例子,考虑一下你在ASP.NET MVC中使用HTML辅助方法的场景。这些辅助方法一般返回HTML。例如,Html.TextBox()辅助方法返回象 <input type=”text”/> 这样的标识。在ASP.NET MVC 2中,这些辅助方法现在默认返回HtmlString类型,表明返回的字符串内容显示是安全的,<%: %>不必再编码了。

这允许你将这些方法在 <%= %> 代码块中:

image

以及 <%: %> 代码块中使用:

image

在上面两种情形中,从辅助方法返回的HTML内容是作为HTML在客户端显示的, <%: %> 会避免做双重编码。

这允许你在应用中默认使用 <%: %> 代码片段,而不是<%= %>代码块。如果你要是固执(hardcore)的话,你甚至可以创建一个编译规则,在应用中查询 <%= %> 用例,如果发现,将其标记为出错,来强制HTML编码总是发生。

ASP.NET MVC 2 视图的脚手架(Scaffolding)

在你使用VS 2010 (或者免费的 Visual Web Developer 2010 Express版本)建造ASP.NET MVC 2应用时,你会发现使用“添加视图”对话框生成的视图在输出任何内容时,现在是默认使用 <%: %> 代码块的。例如,下面,我为 Article 对象生成了一个简单的“编辑”视图。注意其中标签,文本框和验证消息的三个 <%: %> 代码片段用例(都是使用HTML辅助方法输出的):

image

结语

新的 <%: %> 句法 提供了一个简洁的方式来自动对内容进行HTML编码,并将其显示为输出。它允许你减少代码的冗长,可以轻松地检查/核实整个网站上的内容都是HTML编码过了的。这可以帮助你的应用免受跨站脚本注入(XSS)和HTML注入攻击。

希望本文对你有所帮助,

Scott



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Wednesday, September 29, 2010  |  From

【原文地址】 Automatic Properties, Collection Initializers, and Implicit Line Continuation support with VB 2010
【原文发表日期】 Monday, April 05, 2010 11:56 PM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的VS 2010 和 .NET 4所撰写的 贴子系列的第十八篇。

几天前,我在博客中对C# 4.0中的2个新语言特性做了介绍: 《C# 4 中的可缺省参数和具名实参 》。

今天,我将对新加到VS 2010的VB中的几个我最喜爱的新特性做些介绍:自动实现的属性,集合初始器,以及隐式续行支持。

自动实现的属性

在VB 2010之前,使用VB在一个类中实现属性时要求你明确地声明属性,以及声明一个保存其值的存储字段变量。

例如,下面的代码示范了使用VB 2008实现一个“Person” 类,该类提供了2个公开的属性,“Name” 和 “Age”:

image 

虽然象上面那样明确地声明属性提供了最大的灵活性,但在你只需对一个字段进行存储/获取时,我总是发现编写这类型的样板式(boiler-plate)get/set代码枯燥无味。你可以 使用VS的代码片段特性帮助自动生成这样的代码,但它还是生成了一堆感觉是多余的代码。 C# 2008引进了一个叫做自动属性的很酷的语言特性,在属性只是由字段来担当的情形下,能够帮助减少不少代码。VB 2010现在也支持这个特性了。

使用VB 2010自动实现的属性特性的话,我们只要使用下面这个代码就能实现Person类:

image

当你声明一个自动实现的属性时,VB编译器会自动创建一个私有的字段用于保存属性值,还为你生成相应的Get/Set方法。就象你在上面看到的那样,代码极其简明,可读性极其好.

如果你想要的话,句法还支持使用默认值来初始化属性:

image

你可以在这个MSDN网页上了解VB 2010的自动属性支持的详情。

集合初始器

VB 2010现在也支持使用集合初始器来轻松地创建一个集合,填充以一堆起始值。 你可以通过声明一个集合变量,然后使用From 关键词,继以大括号 { } ,在其中包含要添加到集合中去的起始值列表,来识别一个集合初始器。

下面是一个代码例子,我用了新的集合初始器特性,用2个Person对象填充了一个“Friends” Person对象列表,然后将其绑定到一个GridView控件,来显示在网页上:

image

你可以在这个MSDN网页上了解VB 2010的集合初始器支持的详情。

隐式续行支持(Implicit Line Continuation Support)

传统上来说,当VB中的一个语句被分割成多行的时候,你需要使用续行下划线字符 (_) 来表示那个语句还不完整。

例如,在VB 2008中,下面的LINQ查询需要在每行的结尾附加 “_” 来表示查询还不完整:

image

VB 2010编译器和代码编辑器现在添加了被称为“隐式续行支持”的特性,意味着它善于自动检测续行场景了,其结果是,在许多,许多场景中你不再需要明确表示语句的续行了。这意味着,在VB 2010中,我们现在可以不用“_”编写上述代码了:

image

隐式续行特性在VB中编辑XML明文(XML Literals)时也工作(非常酷)。

你可以在这个MSDN网页上了解VB 2010的隐式续行支持的详情以及该特性支持的许多场景(向下卷动到“Implicit Line Continuation”那部分看详情)。

结语

上面的3个VB语言特性是VB 2010中众多新语言和代码编辑器特性的几个而已,访问该网站以了解VB 2010发布中的其他一些语言特性的详情。

也请订阅VB开发团队的博客,通过他们定期发表的博客贴子进一步学习以及了解近况。

希望本文对你有所帮助,

Scott



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Wednesday, September 29, 2010  |  From

【原文地址】 Optional Parameters and Named Arguments in C# 4 (and a cool scenario w/ ASP.NET MVC 2)
【原文发表日期】 Friday, April 02, 2010 1:28 AM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的VS 2010 和 .NET 4所撰写的 贴子系列的第十七篇。

今天的贴子讨论新加到C# 4.0中的2个语言特性: 可缺省参数(optional parameters)和具名实参(named arguments),以及在ASP.NET MVC 2(VB 和 C#)中一种利用可缺省参数的很酷的方式。

C# 4.0中的可缺省参数

C# 4.0现在对方法,构造器,以及索引器支持使用可缺省的参数(注:VB支持可缺省参数可是有年头了)。

当参数的默认值作为声明的一部分被指定的时候,参数就是可缺省的。例如,下面这个方法接受2个参数,一个“category” 字符串参数,另一个“pageIndex”整数参数。“pageIndex”参数有一个默认值 0,它因此是一个可缺省的参数:

image

当调用上面的方法时,我们可以显式地传递2个参数给它:

image

或者我们可以省略掉传递第二个参数,在这样的情形下,其默认值0就会被传进去:

image 

注意,VS 2010的Intellisense在显示语句完成时,会表示哪个参数是可缺省的,以及它的默认值:

image

C# 4.0中的具名实参和可缺省参数

C# 4.0现在还支持“具名实参”的概念。这允许你把传给一个方法的参数显式地命名,而不是通过实参的位置来识别它。

例如:我可以编写下面这样的代码,通过其名称来识别传给GetProductsByCategory方法的第二个参数(将其用法变得更为明确一点):

image

当一个方法支持多个可缺省参数,而你想要指定在传递哪个实参时,具名实参会非常有用。例如,下面我们有一个DoSomething方法,其接受2个可缺省参数:

image

我们可以使用具名实参,以下面任何一种方式来调用上面这个方法:

image

因为2个参数都是可缺省的,在只有1个(或者0个)参数被指定的情形下,那个没被指定的参数的默认值就会被传进去。

ASP.NET MVC 2 和可缺省参数

有一个非常棒的使用场景,我们可以在其中利用VB 和 C#中可缺省参数支持,那就是ASP.NET MVC 2中控制器类上的Action方法的输入绑定支持。

例如,考虑一个我们想要把“Products/Browse/Beverages” 或 “Products/Browse/Deserts”这样的URL映射到一个控制器action方法的场景。我们可以编写一个URL导向规则,将URL映射到一个方法上,象这样:

image

然后,我们可以选择使用一个“page”查询字符串值来表示由Browse方法显示的结果是否应该是分页的,如果是分页的,应该显示结果的哪一页。例如,/Products/Browse/Beverages?page=2。

在 ASP.NET MVC 1中,你一般这样处理,在action方法上添加一个“page” 参数,将其设置为 nullable int (意味着如果“page”查询字符串值不存在的话,其值就是null)。然后你可以编写象下面这样的代码,将 nullable int 转换成一个 int,如果查询字符串中不存在值的话,就赋予一个默认值:

image

在ASP.NET MVC 2中,你现在可以利用VB 和 C#中的可缺省参数支持,来更简明,更清晰地表达这个行为。只要将action方法的参数声明为带默认值的可缺省参数即可:

C#

image

VB

image

如果查询字符串有“page” 值的话(例如 /Products/Browse/Beverages?page=22 ),它就会以一个整数传给该action方法。如果查询字符串没有“page” 值的话 (例如 /Products/Browse/Beverages),默认值0就会被传给该action方法。这使得代码更加简明,可读性也提高了。

结语

VS 2010 中的 C# 和 VB 带有一堆很棒的新语言特性。上述2个特性(可缺省参数和具名实参)是其中2个而已,在以后我还会在博客中讨论更多其他的新特性。

如果你在寻找一本总结了C#中所有语言特性(包括C# 4.0中的),以及对核心.NET类库有很好的概述的好书的话,你也许应该查阅一下 O’Reilly出版社新出版的《C# 4.0 in a Nutshell》一书:

image

该书以例程查找方便的格式,封装了大量的内容。

希望本文对你有所帮助,

Scott



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Tuesday, September 28, 2010  |  From

【原文地址】 Cleaner HTML Markup with ASP.NET 4 Web Forms - Client IDs (VS 2010 and .NET 4.0 Series)
【原文发表日期】 Tuesday, March 30, 2010 7:02 PM

【译注;由于工作繁忙,三月份之后一直没有时间翻译Scott Guthrie的博客。欣慰的是,新的贴子已由微软指定的专门公司做了翻译,这里我将补上其间没有翻译的一些技术贴子。 --思归】

这是我针对即将发布的VS 2010 和 .NET 4所撰写的 贴子系列的第十六篇。

今天的贴子是我将撰写的几个相关贴子的第一篇,主要讨论我们所做的一些重大改动,旨在使ASP.NET 4 的Web Forms生成整洁,与标准相兼容,CSS友好的标识。今天,我将讨论我们正在做的工作,以对由服务器控件显示到客户端的“ID”属性提供更好的控制。

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

整洁,与标准相兼容,CSS友好的标识

开发人员对ASP.NET Web Forms经常埋怨的一个东西,就是在使用服务器控件时,他们无法生成整洁的,CSS友好的输出和标识。下面是一些对早期ASP.NET版本的埋怨例子:

  • 对HTML中自动生成的ID属性难以编写JavaScript来操作和使用CSS来做样式化
  • 某些控件(特别是asp:menu控件)使用了表格(table),而不是更具语义的标识,使得样式很丑陋
  • 一些控件生成了行内的样式属性,尽管控件上没设置样式属性
  • ViewState经常是大得出奇

ASP.NET 4对建造与标准兼容的网页提供了更好的支持, ASP.NET 4 中内置的 <asp:> 服务器控件现在生成干净了许多的标识, 支持CSS样式化,来帮助解决上面提到的所有问题。

升级现有的ASP.NET Web Forms应用时的标识兼容问题

当听说ASP.NET 4即将提供整洁的标识时,大家常问的一个问题是,“太棒了,但我现有的应用怎么办?在我升级后,这些变动或改进会不会造成问题?”

为帮助确保我们不会破坏现有的ASP.NET Web Forms应用中对标识和样式所做的假设,我们在 web.config中启用了一个配置标记,controlRenderingCompatbilityVersion,让你决定你是想使用新的ASP.NET 4应用默认的新的整洁标识方式呢,还是为兼容起见,显示与所使用的早期ASP.NET版本同样的标识:

image 

controlRenderingCompatbilityVersion属性设置为“3.5”时,你的应用和服务器控件会默认使用与VS 2008 和 .NET 3.5一样的标识生成机制来生成输出。当 controlRenderingCompatbilityVersion属性设置为“4.0” 时,你的应用和服务器控件会严格遵循XHTML 1.1规格,生成整洁的客户端ID,显示时以语义正确为宗旨,除去不相关的行内样式。

在使用ASP.NET 4建造的所有新的 ASP.NET Web Forms中,该属性的默认值是4.0。使用VS 2010升级的任何以前的应用,都会被升级向导设置controlRenderingCompatbilityVersion为3.5,以确保向后的兼容性。然后你可以选择改变这个设置(在应用级别,或在web.config文件中局限于页面或目录级别),如果你决定改动页面来使用CSS,来利用新的标识显示机制的话。

今天的整洁标识标题: 客户端ID

在生成的HTML元素上能够拥有干净的,可预料的ID属性是开发人员一直要求Web Forms提供的东西(象 “ctl00_ContentPlaceholder1_ListView1_ctrl0_Label1”这样的ID值实在是不受欢迎)。能够控制生成的ID值有助于简化针对输出编写的客户端JavaScript,简化使用CSS对元素所做的样式化,在大的网页上有助于减少所生成标识的总的大小。

控件上新的ClientIDMode属性

ASP.NET 4在Control这个基类上支持一个新的ClientIDMode属性。ClientIDMode属性表示控件在显示时,该如何生成客户端ID值。ClientIDMode 属性支持4个可能的值:

  • AutoID --生成与.NET 3.5一样的输出(为兼容起见,自动生成的ID还会含有象ctrl00这样的前缀)
  • Predictable (默认值)--除去任何“ctl00” ID 字符串,如果是列表或容器控件,则把子控件的ID串列起来 (例子:id=”ParentControl_ChildControl”)
  • Static (静态)--将ID命名控制完全交给开发人员,他们设置什么ID值,就显示什么值 (例子: id=”JustMyId”)
  • Inherit (继承)--告诉控件使用父容器控件的命名行为模式

ClientIDMode属性可以直接设置在单独的控件上(或在容器控件中, 内中包含的控件会默认继承该设置):

image

或在页面或用户控件层次设置(使用 <%@ Page %> 或 <%@ Control %> 指令),这样在页面或用户控件中的控件会继承这个设置(还可以选择覆盖这个设置):

image

也可以在应用的web.config文件中设置,这样应用中的所有页面都会继承这个设置(还可以选择覆盖这个设置):

image

这给予了你任意定制/覆盖命名行为的灵活性。

例子:使用ClientIDMode属性控制非列表控件的ID

让我们来看一下,如何使用新的ClientIDMode属性来控制网页中 “ID” 元素的生成。为帮助示范,我们创建了一个简单的网页,名为“SingleControlExample.aspx”,是基于名为“Site.Master”的母版页的,内含单个<asp:label> 控件,其ID为“Message” ,该控件是包含在名为 “MainContent”的 <asp:content>容器控件中的:

image

然后在后台代码中,我们加了一些象下面这样的简单的代码,在运行时动态填充Label的 Text属性:

image 

如果我们是在 ASP.NET 3.5 中 运行该应用(或将ASP.NET 4应用配置使用了3.5显示方式或ClientIDMode=AutoID运行的话),那么生成发送到客户端的标识会是这样的:

image

这个ID是独特的(是好事),但因为其“ct100”前缀,又很丑陋(是坏事)。

使用ASP.NET 4以及ClientIDMode被设置为 “Predictable”时的标识显示

在ASP.NET 4中,服务器控件现在默认使用 ClientIDMode=”Predictable”来生成它们的ID。这帮助确保ID值依然是独特的,在页面上没有冲突,但同时也使得ID不那么冗长,比较可以预料。这意味着我们上面的 <asp:label> 控件生成的标识在ASP.NET 4默认的情形下,会是这样的:

image

注意“ct100”前缀现在没有了。因为 “Message” 控件是内嵌在“MainContent” 容器控件中的,在默认情形下,它的ID会被前缀,成为 “MainContent_Message”,以避免与网页上的其他控件相冲突。

使用ASP.NET 4以及ClientIDMode被设置为“Static””时的标识显示

但有时,你不想要你的ID值被分层嵌套,而只是想显示你设置的任何值。要启用这个的话,你现在可以使用ClientIDMode=Static,这样显示的ID值会跟你在服务器端在你的控件上设置的ID值完全一样。这在ASP.NET 4中会导致下述标识:

image

这个选项现在给予你完全控制控件发送到客户端的ID的能力。

例子:使用ClientIDMode属性控制数据绑定列表控件的ID

数据绑定的列表/网格在Web Form自动生成的ID方面一直以来一直是最难使用和样式化的。现在让我们来看一个场景,看如何在ASP.NET 4中对使用ListView控件生成的ID进行定制。

下面的代码片段是个ListView控件的例子,显示了一个数据绑定集合(机场)中的内容:

image

然后,我们在后台代码中编写下述代码来动态绑定一个机场列表到上面的ListView上:

image

然后在运行时,这会默认生成象下面这样的 <ul> 机场列表。注意,因为 ListView模板中的 <ul> 和 <li> 元素不是服务器控件,在标识中是不会有ID的:

image

给每个行项添加客户端ID

现在,说我们想要给输出添加客户端ID,这样我们可以通过JavaScript使用编程手法来访问每个<li>。我们想要使得这些ID是独特的,可预料的,以及可辨识的。

第一种做法是将模板中的每个 <li> 元素标记为服务器控件(给它一个runat=server属性),并且给其一个id为“airport”:

image

在默认情形下,ASP.NET 4现在会生成象下面这样整洁的ID(不生成象ctl001这样的ID):

image 

使用ClientIDRowSuffix属性

我们上面的模板给每个 <li> 元素生成了独特的ID,但假如我们想要在客户端使用JavaScript通过编程手法来访问它们的话,我们也许想要使得ID包含对应的机场的Code属性,以简化引用。好消息是,我们可以轻松地达到目的,通过利用ASP.NET 4中数据绑定控件上的ClientIDRowSuffix属性来更好地控制单独行元素的ID。

要实现的话,我们将在ListView控件上设置ClientIDRowSuffix属性为“Code”。这告诉ListView在生成ID时,使用Airport类的“Code”数据绑定属性:

image

这样,行的ID后缀不再是“1”, “2”, 或 “3”,而是将Airport.Code值嵌合到ID中去了(例如:_CLE, _CAK, _PDX等等):

image

你也可以在其他数据绑定控件(象GridView)上使用 ClientIDRowSuffix。在你想要在客户端对行元素进行编程,在JavaScript代码中使用干净的/可辨识的ID来轻松地引用这些元素时,这会非常有用。

结语

ASP.NET 4允许服务器控件和你的Web Forms应用生成干净许多的HTML标识。

在今天的贴子中,我讨论了如何轻松地控制由服务器控件生成的客户端ID值。在以后的贴子里,我还将讨论 ASP.NET 4发布中其他一些标识方面的改进。

希望本文对你有所帮助,

Scott



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Monday, September 27, 2010  |  From

[原文发表地址]:August 29th Links: .NET, ASP.NET, IIS Express, Silverlight, Windows Phone 7

[原文发表时间]:2010/8/29, 11:23 PM

 

这里是上次我的精选好文链接系列,另外我正在写的其他的博客系列,请参看VS 2010和.NET 4系列ASP.NET MVC 2系列

.NET/WPF/EF

· 优化代码的5个C#/.NET小秘籍:James写的不错的博客,着重描述了你可以用在自己程序里的5个不错的编程语言/框架的技巧。我敢打赌肯定有很多人不知道StopWatch类。

· WPF Ribbon控件正式发布:WPF团队最近正式发布WPF Ribbon控件V1版。 这让创建类Ribbon程序变得简单。当然也请参阅WPF团队的博客来了解它更详细的功能。

· EF4 .Include()函数对Lambda的支持:在EF4里用Include()函数加载关联数据时,想用Lambda表达式替换字符参数?这篇文章就教你怎么做。

ASP.NET

· ASP.NET和IIS 7性能调优的技巧第一部第二部:Mads写了一系列文章来介绍ASP.NET和IIS 7的性能优化技巧。

· 使用ASP.NET 4里的ViewStateMode属性实现更好的ViewState管理:Scott Mithcell写了一篇不错的文章来探讨ASP.NET 4控件所支持的新的ViewStateMode属性。这样你在页面上可以更好地控制viewstate的使用。

· 使用ASP.NET 4的QueryExtender控件过滤数据:Scott Mithcell的一篇好文讲解了ASP.NET 4里面新的<asp:QueryExtender>控件,它让对LinqDataSource或EntityDataSource执行动态查询变得非常简单。

· 避免重复URL的技术:Scott Mithcell的另外一篇不错的文章,探讨了避免在ASP.NET网站里对同一内容出现重复URL的技术。这些技术可以改进搜索引擎的流量。

· ASP.NET 4里在插入时自动预填充数据:Scott Hunter写了一篇好文探讨在ASP.NET 4的数据控件(data control)插入数据时指定默认值的方法。

ASP.NET MVC

· MvcContrib模板库:下载58个预建的ASP.NET MVC模板库,你可以用它们自定义自己网站的外观。它们都遵循社区共用协议(Community Commons license)。

· 在VS调试器里跟入ASP.NET MVC源代码:来自Gunnar的一篇好文描述了使用VS 2010内置的对符号服务器的支持,在调试时跟入ASP.NET MVC框架源代码的方法。

· ASP.NET MVC的安装选项:Jon的一篇不错的文章,描述了在服务器上安装ASP.NET MVC 2的方法。在尚未安装ASP.NET MVC的服务器上安装它有好些方法 — 最简单的方式就是针对System.Web.Mvc.dll启用“拷贝到本地(Copy Local)”标志,并安装它到\bin文件夹。

IIS Developer Express

· Visual Studio对IIS Express, SQL Compact 版本以及Razor语法的支持:Damian Edwards和Scott Hanselman在Channel 9上关于Visual Studio 2010对于IIS Express,SQL 4 CE和Razor语法支持的视频。

· 如何在VS里使用IIS Express:Kamran有一篇不错的博客描述了在Visaul Studio里使用IIS Express的方法—不需要等待Visual Studio官方补丁就可以用的方法。

Silverlight and Windows Phone 7

· Windows Phone 7开发者路线图:Windows Phone 7团队博客上关于Windows Phone 7,以及与之对应的Visual Studio和Expression Blend的发布时间表。官方的正式开发版本将于9月16号发布。

· 7分钟学用Windows Phone 7:一个不错的7分钟系列视频,帮助你快速理解并学会Windows Phone 7和它背后的程序开发基础知识。

· Windows Phone 7抢跑培训:一个不错的免费培训的列表,你可以在线观看学习使用Silverlight和XNA创建Windows Phone 7程序的方法。

· Windows Phone 7下的Silverlight Panorama和Pivot控件:Jeff的一篇不错的博客,讨论了Silverlight里超炫的Panorama和Pivot控件,而且它们将被包含在正式的Windows Phone 7程序开发版本中。

· 在Windows Phone 7下使用Silverlight的XNA:来自Mike的一篇好文,演示了Windows Phone 7上,在Silverlight应用程序上使用XNA API的方式。文章演示了Silverlight里的XNA音频框架。

· 创建Windows Phone 7下高性能的Silverlight程序:我的团队写的一篇非常不错的白皮书,探讨了让Silverlight 程序在Windows Phone 7上运行得更好的最佳实践。

· Windows Phone 7下Silverlight的性能:Scott Hanselman的一个不错的播客,讨论了让Windows Phone 7程序有更流畅和更佳用户体验的技法。

推荐书籍

大家经常问我推荐几本.NET方面的书。这本书是我经常密切关注而且觉得非常有用的书。如果你在寻找一个一站式的关于C#和.NET基本类库的参考书,C# 4.0 in a Nutshell就是一本不错的书:

clip_image001

希望这能对您有所帮助。

附:[除了写博客以外,我现在也使用推特(Twitter)来及时更新状态和分享链接,您可以到这个地址“推”我一下:twitter.com/scottgu]



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Monday, September 27, 2010  |  From

[原文发表地址]:Search and Navigation Tips/Tricks with Visual Studio

[原文发表时间]:2010/8/24 12:24 AM

 

这是我写的关于VS2010和.Net4的博客系列的第27篇。

今天的文章继续上星期我的调试技巧文章,并谈谈Visual Studio里比较有用的搜索和浏览的技巧。我的朋友Scott Cate(他写了很多关于VS使用技巧和窍门的博客)最近向我强调了这些很好的技巧,大部分使用VS的开发人员好像不知道这些技巧(即使他们大部分都在产品开发组呆过一阵子)。

如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们。 它们学起来很容易,能帮你节省很多时间。

Ctrl + i 渐进搜索

大多数使用Visual Studio的程序员都习惯了在IDE里按“Ctrl + F”键来打开“查找窗口”。但令人惊讶的是,有很多程序员不知道Visual Studio里的“渐进搜索”这个功能。它可以让你在当前文档里进行搜索,而且允许你不用打开对话框就可以搜索。

使用渐进搜索

在编辑器里按“Ctrl + i”即可启用渐进搜索。它会换掉鼠标图标,并将IDE状态栏的左下角改成“渐进式搜索:(搜索关键字)”—你可以键入要搜索的关键字,并且编辑器会从你在源代码的位置开始搜索(不用打开对话框)。

下面我们搜索“action”,VS会在文件里高亮第一次使用到它的地方。

clip_image002

我们可以接着按“Ctrl + i”来搜索下一个用到它的地方(可以重复多次):

clip_image004

按“Ctrl + Shift + i”可以反方向搜索,这样避免回溯。

你可以通过“Esc”键跳出渐进式搜索。这里有关于渐进式搜索更详尽的资料。

F3Shift + F3 – 使用以前的关键字查找

关于渐进式搜索的一个很炫的技巧是,当你按下ESC键退出搜索时,它会将关键字添加到IDE的查找栈里。在VS的标准工具栏上的“查找”下拉框,你可以看到用过的搜索关键字:

clip_image006

在Visual Studio里,按F3键可以让你重复上次的搜索。这在你查找一些东西,改一下代码,然后要从改动过的地方继续搜索的时候非常有用。只要按下F3,你就可以在文档新的位置上重复上次的搜索(例如“action”)—不需要重新键入搜索关键字。

按“Shift + F3”可以使用 上次搜索关键字进行反向搜索(从光标在编辑器的当期位置开始)。你可以很方便地用F3/Shift+F3的组合在文档里向前向后搜索。

Ctrl + F3 搜索当前选择的文本

另外一个搜索技巧是,为了避免键入关键字,你可以在代码编辑器里选中一个单词(或单词的一部分),然后按“Ctrl + F3”来在当前文件搜索下一个用到它的地方:

clip_image008

按“Ctrl +F3”搜索选中文本的下一个实例—这样避免你键入它:

clip_image010

跟前面讲的类似,你可以用“Ctrl + Shift + F3”来进行反向搜索,即从文本里回溯搜索。

Ctrl + Shift + F – 在解决方案里搜索

有时你会想在整个解决方案里进行搜索。

“Ctrl + F”打开的查找对话框默认是在当前文档进行搜索。“Ctrl + Shift + F”打开的查找对话框默认在整个解决方案里进行搜索:

clip_image012

执行一个这样的搜索,会打开IDE里的“查找结果”窗口,你可以在里面定位到搜索关键字的每个实例:

clip_image014

你可以在“查找结果”窗口里双击一项来跳到关键字出现的地方。

有一个很多人都不知道的技巧,就是按“F8”或者“Shift + F8”可以在列表的前后项之间切换。这使得在里面定位变得更快更容易,这样就不用使用鼠标来进行移动了。

Shift + F12 – 查找用途

大部分使用Visual Studio的程序员都知道选中一个类型,然后按F12来“转到定义”。它会跳转到定义类型的地方,这样查看类型定义就变得很方便。

但大部分程序员都不知道“Shift + F12”—它会找出所有用到一个特定类型的地方。让你快速找到一个类型的用法。要用它,只要选中或者把光标放在一个类型,然后按“Shift + F12”:

clip_image016

然后它会打开“查找符号结果”窗口,并列出当前解决方案里所有用到这个类型的地方:

clip_image018

跟前面一样,按“F8”或者“Shift + F8”可以在列表的前后项之间切换。

Ctrl + 减号 Shift + Ctrl + 减号 向前/向后定位

打开另一个代码文件,查看一些东西,然后想回到前面文件的位置,这样的经历你有过吗?比如说,用F12“转到定义” 后,然后要跳回原来用到类型的代码那里?

一个很多人都不知道的VS的功能,就是“回溯定位”组合键—“Ctrl + (减号键)”。它会在导航栈中跳转到以前的文档或者位置。

要看它是如何工作的,请先在Visual Studio里选中一个类型。下面我选中了“IController”接口:

clip_image020

按F12跳到它的定义处,会打开一个新的编辑器窗口并显示选中类型的源代码:

clip_image022

现在要回到我们当初的位置,按“Ctrl + (减号键)”,然后VS就会把我们带回原来的地方:

clip_image023

而如果你想要在导航栈里往前走(也就是要回到IController.cs文件),那就按“Shift + Ctrl + (减号键)”。

Sara Ford有一篇不错的文章深入讲解了这个功能,还解释了将新的位置压入导航栈的条件。

Ctrl + Alt + (向下键) - 定位一个打开的文件

曾经在IDE里打开了数不清的文件,想要找到一个容易的方法漫步其中?

一个很有用的按键组合就是“Ctrl + Alt + (向下键)”—这时VS会显示一个下拉框并列出所有打开的文件:

clip_image025

你可以使用箭头键来选择要浏览的文件—或者最好开始敲文件名,Visual Studio会为你在列表里高亮它。比如说,上面我敲了“Mo”,Visual Studio高亮“ModelBinder.cs”。按下“Enter”键就会帮我打开那个文件:

clip_image027

这是一个在文件之间很好的、便利的浏览方式,不需要使用鼠标,或者要让你的手离开键盘。另外记住“Ctrl + (减号)”可以让你回到原来的位置。

定位到,调用层次结构和引用高亮功能

Visual Studio 2010提供了一大批新的代码定位和查找功能—包括新的“定位到”对话框,“查看调用层次结构”功能和引用高亮功能:

clip_image029

我在之前的博客里提到了VS 2010这三个新功能。如果你还没有读过这篇文章并体验它们的能量,我非常推荐你去试试—它们是很好的补充。

编辑器其他方面的改进

VS 2010里面有数不清的改进—我在之前的博客里也提到很多。这使我之前的几篇VS 2010编辑器的文章:

· 改进过的C#/VB代码智能感知

· 改进过的JavaScript代码智能感知

· 框选和多行编辑支持

· ASP.NET, HTML和JavaScript代码片段支持

另外也请看看我关于VS 2010和.NET 4改进系列的其他博客。

总结

上面大部分功能实际在Visual Studio已经存在了好几个版本—但还是有非常多的程序员不知道他们。希望这篇博客提供了一条捷径帮你了解它们。如果你需要记住这些按键—打印一份VS 2010快键招贴画,并贴在你显示器旁边。

如果还要学习更多的Visual Studio技巧,请订阅Scott Cate的Visual Studio技巧系列文章(里面已经有83个超棒的技巧了),也可以订阅Sara Ford的博客—历年来,她也有一个很棒的技巧集。

希望这能对您有所帮助。

附:[除了写博客以外,我现在也使用推特(Twitter)来及时更新状态和分享链接,您可以到这个地址“推”我一下:twitter.com/scottgu]



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Monday, September 27, 2010  |  From

[原文发表地址]:Debugging Tips with Visual Studio 2010

[原文发表时间]:2010/8/19 10:48 AM

 

这是我写的关于VS2010和.Net4发布的博客系列的第26篇。

今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友Scott Cate(他写了很多很好的关于VS使用技巧和窍门的博客)最近向我强调了这些很好的技巧,大部分使用VS的开发人员好像不知道这些技巧(即使他们大部分都在产品开发组呆过一阵子)。 如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们。 它们学起来很容易,能帮你节省很多时间。

运行到光标(Ctrl+ F10

我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码前设置一个断点,然后反复的敲F10/F11来逐步通过代码,直到到达他们真正想要研究的确切位置。有些时候他们需要仔细观察所跨过的每行代码,这样使用F10/F11 就很合理。 但是更普遍的是,他们只想快点进入他们真正关心的那行代码——这是使用F10/F11 就不是最好的选择了。

相反, 你可能想利用调试器支持的特性“运行到光标”。 只需简单地把你的光标放在代码中你想程序运行到的那一行,然后同时敲Ctrl+F10。这样程序就会运行到光标所在的那一行, 然后执行中止,由调试器控制——这样就节约了你反复敲击F10/F11到达那里的时间。即使你想运行到的那行代码不在当前调试的方法或类里,而是在一个独立的方法或类里,这也同样奏效。

条件断点

我们经常在可用性学习中见到另一个普遍的技巧:开发人员设置断点,运行程序,试着输入一些数据,当到达一个断点时,手工检查某种条件是不是成立,如果成立才决定进一步研究。 如果条件不符合他们想要的, 按F5继续执行程序,尝试另外一些输入,再手工重复同样的过程。

VS的条件断点功能提供了一个更加容易的方法来处理以上情况。 条件断点允许你只在某种明确指定的条件成立时才中止执行,由调试器控制。这帮你免于手动检查/恢复你的程序, 使得整个调试过程免去许多手工活,也不那么冗长乏味。

设置一个条件断点

设置一个条件断点十分简单,在代码里按F9为某一行设置一个断点:

clip_image002

然后右击断点——编辑器左边的红色圆圈,在右键菜单中,选择“条件…” :

clip_image004

将弹出以下对话框, 允许你指明某种条件,只有当这种条件成立时,断点才能达到。 例如:我们可以通过写下面的表达式来指明,只有当paginatedDinners列表元素的个数小于10时,才中止程序,由调试器控制。

clip_image006

现在, 当我重新运行程序来研究一下, 调试器只在这个查找返回值小于10时,才中止程序执行。 如果返回值不小于10 ,将不会触发断点。

命中次数功能

有时你只想在条件第N次成立时中止执行。例如:仅当第5次出现查找返回值小于10时,才中止执行。你这样启用这个功能:右击断点, 选择“命中次数…”菜单命令。

clip_image008

将弹出以下对话框, 允许你指明程序中断的条件:条件被第N次满足时,或者条件被满足的次数是N的倍数时,或者条件被满足的次数大于等于N次时。

clip_image010

机器/线程/进程筛选器

你可以右击断点,选择“筛选器…”菜单命令, 来指明断点只在某台特定的机器,或某个特定的进程或线程中才能被触发。

跟踪点——当击中断点时自定义行为

很多人不知道的一个调试功能是使用跟踪点。 跟踪点是一个断点, 当它被击中时,某种自定义的宏会被触发执行。当你想研究你的应用程序而又不想中止执行程序时, 这个功能特别有用。

我将用一个简单的控制台程序来演示如何使用跟踪点。 下面是斐波那契数列的递归实现:

clip_image012

在上面的应用程序中,针对特定的输入,我们使用Console.WriteLine()来输出最后的斐波那契数列。假如我们想在调试过程中研究斐波那契的递归过程——而不停止调试的执行? 跟踪点能帮我们很轻松地做到这一点。

设置跟踪点

你可以这样启用跟踪点:按F9在代码上设置一个断点, 右击断点,在右键菜单中选择“命中条件…”菜单命令:

clip_image014

将弹出以下对话框——允许你指定当断点触发时,进行何种操作:

clip_image016

如上所示,我们指定每次当断点的条件成立时,打印跟踪信息。注意我们指定了想要输出的局部变量“X” 的值作为输出信息的一部分。 局部变量能通过{变量名}的语法被引用。 也有内嵌的命令(像$CALLER,$CALLSTACK, $FUNCTION等等)可以用来输出跟踪信息中常见的值。

上面对话框的底部, 我们也选中了“继续执行”单选框——表示我们不希望调试器暂停程序。 相反,程序会继续执行——只是我们自定义的跟踪信息会在每次断点条件满足时输出,就这点不同。

现在当我们运行程序时,我们会发现自定义的跟踪信息会自动出现在VS的输出窗口中——使我们能看到程序的递归过程。

clip_image018

你也可以选择为你的程序设置一个自定义跟踪监听器——这样跟踪点的输出信息就会被重定向到它里面,而不是VS的输出窗口里。

跟踪点——运行自定义的宏

上周我在伦敦做了一次演讲, 听众中有个人问了这样一个问题:有没有可能当击中一个跟踪点时,自动输出所有的局部变量。

这个功能不是内置在VS中的, 但是可以通过在VS中写一个自定义的宏来启用它,然后设置一个跟踪点,当它被击中时,调用这个宏。 为了实现这个目的, 打开VS中的宏窗口(工具->宏->宏菜单命令)。然后在项目管理器“MyMacros”结点下面, 选择模板或者新建一个模板(如:添加一个名为“UsefulThings”的 模板), 再将下面的VB宏代码贴到模板里,并保存它:

Sub DumpLocals()

Dim outputWindow As EnvDTE.OutputWindow

        outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object

Dim currentStackFrame As EnvDTE.StackFrame

        currentStackFrame = DTE.Debugger.CurrentStackFrame

        outputWindow.ActivePane.OutputString("*Dumping Local Variables*" + vbCrLf)

For Each exp As EnvDTE.Expression In currentStackFrame.Locals

            outputWindow.ActivePane.OutputString(exp.Name + " = " + exp.Value.ToString() + vbCrLf)

Next

End Sub

上面的宏代码依次检测当前堆栈,获取所有的局部变量,并将其显示在输出窗口。

使用DumpLocals自定义宏

在下面这个简单的应用程序中,我们可以利用自定义的“DumpLocals”宏:

clip_image020

在上面的Add方法的return语句上,按F9设置一个断点。 右击断点,选择“命中条件…”菜单命令:

clip_image021

将弹出以下对话框,上例中,我们选中了“打印信息”的单选框,再手工指定希望输出的变量, 而这里, 我们选中“运行宏”的单选框,使它指向我们创建的自定义宏UsefulThings.DumpLocals:

clip_image023

我们仍然选中“继续执行”单选框,这样能保证当跟踪点被击中时,程序依然能够继续执行。

运行程序

现在当我们按F5运行程序,当调用Add方法时,我们将看见以下输出出现在VS输出窗口中。 注意当跟踪点被击中时,宏是如何自动列出各个变量名及其值的。

clip_image025

总结

VS调试器功能非常丰富。 我强烈建议大家抽出一些时间来学习它的所有功能。 以上的技巧和诀窍只是很多大家没有真正意识到的功能中的一小部分。

我之前写过其他一些关于VS2010调试器改进的博客(包括数据标签固定,断点导入导出,保留最后值变量, 等等)。 我将发表更多关于VS2010的智能跟踪和转储文件调试支持的博文。这些技术提供了很多非常酷的新功能,会让程序(包括产品中的程序)的调试变得非常简单和强大。

也请务必看看Scott Cate很棒的VS2010技巧和诀窍系列,你可以学习如何更好的利用VS。他有一些非常棒的免费视频和博客。

也要看看Jim Griesmer很棒的VS调试技巧和诀窍系列。 他有许多很好的可以利用的技巧和诀窍。

希望这能对您有所帮助。

附:[除了写博客以外,我现在也使用推特(Twitter)来及时更新状态和分享链接,您可以到这个地址“推”我一下:twitter.com/scottgu]



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

Sunday, September 26, 2010  |  From

嗯,是的,最近闹得沸沸扬扬的ASP.NET Security Vulnerability同样会影响SharePoint Server。如果你手头有正在运行的SharePoint生产服务器(特别是服务器是用来提供Internet Web网站服务的情况),请确保阅读了这篇文章。Erucy已经写了一篇专门的文章讲述SharePoint 2007/2010的workaround



博客堂源代码发布已经发布于Codeplex,邀请您来捉臭虫

  News Feed 

Last edited Dec 7, 2006 at 10:16 PM by codeplexadmin, version 1

Comments

No comments yet.