VS2008新特性
- 简单介绍及体会:
- 把Ajax extension集成到了Visual studio2008中;
- JS 智能感知;
如在编辑页面加入如下语句,则编辑器就支持JQuery智能提示 <script src="JqueryIntellisense/
jquery-1.2.6.js" type="text/javascript"></scrip t> <%if(false)
{ %><script src="JqueryIntellisense/
jquery-1.2.6-vsdoc.js" type="text/javascript"></scrip t> <%} %>
- LINQ(Language Integrated Query);
体会:在操作Objects,Sql,Xml,
Entities,DateSets时, 使用Linq是非常方便的;部分代码如下:
string[] array = {"wis","dd","aa","ad" }; IEnumerable<string> res = from s in array where s.StartsWith("a") orderby s select s;
foreach(string r in res)
{
Console.WriteLine(r);
}
- Var 隐式类型;
注:隐式本地变量的声明必须同时包含一个初始化器。
- 自动的属性,可以在编译的时候,生成private data field;
- 扩展方法:可以为编译好的程序集动态的添加方法;
体会:必须是static类+static方法;
以下是一个Json对象转换的类: namespace LSHI.JsonHelper
{
public static class OperatorJson
{
public static string ToJSON(this object obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(
obj.GetType()); using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
return Encoding.Default.GetString(ms.
ToArray()); }
}
public static T ParseJSON<T>(this string str)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.
GetBytes(str))) {
DataContractJsonSerializer serializer = new DataContractJsonSerializer(
obj.GetType()); return (T)serializer.ReadObject(ms);
}
}
}
}
使用如下:
IList<User> listUser = new List<User>
{
new User{UserID="1001",UserName="
shilin1",UserAge=10}, new User{UserID="1002",UserName="
shilin2",UserAge=20}, new User{UserID="1003",UserName="
shilin3",UserAge=30} };
string str = listUser.ToJSON();
IList<User> obj = str.ParseJSON<List<User>>();
- 扩展接口;
项目中有些对象经常需要重置部分或全部属性到初始状态, 想给这些类全部都加上个Reset()方法,又显得太冗余, 如果利用扩展接口就显得很容易。代码如下: 先定义一个接口:
public interface IResetable { }
扩展这个接口:
public static class ResetableImpl
{
public static void Reset(this IResetable obj)
{
var ctor = obj.GetType().GetConstructor(
BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null);
ctor.Invoke(obj, null);
}
}
定义一个使用该接口的类:
class Mail : IResetable
{ public string Subject { get; set; }
public string Body { get; set; }
public MailAddress From { get; set; }
public MailAddress To { get; set; }
public Mail()
{ this.Subject = "";
this.Body = "";
this.From = null;
this.To = null;
}
}
具体使用就很简单:
public class Program
{ static void Main(string[] args)
{
Mail mail = new Mail();
mail.From = new MailAddress("wuchangx@qq.com")
; mail.To = new MailAddress("friend@anywhere.
com"); mail.Subject = "hi friend";
mail.Body = "mail content.";
Console.WriteLine("1/nFrom={0}
,To={1},/nSubject={2},Body={3} ", mail.From, mail.To, mail.Subject, mail.Body);
mail.Reset();
Console.WriteLine("2/nFrom={0}
,To={1},/nSubject={2},Body={3} ", mail.From, mail.To, mail.Subject, mail.Body);
Console.ReadKey();
}
}
- 局部方法 局部类型;
- 初始化;
IList<User> listUser = new List<User> {
new User{UserID="1001",UserName="
shilin1",UserAge=10}, new User{UserID="1002",UserName="
shilin2",UserAge=20}, new User{UserID="1003",UserName="
shilin3",UserAge=30} };
- 匿名类型;
var q = DataSession.Objects.Where (c => c.ReceiverName == receiverName && c.ProcessType == 0 && c.Deleted == 0
&& c.Archived == 0 && c.IsDraft == 0 && c.ReceiverArchived == 0).OrderByDescending(c => c.ReceiveDate);
- Lambda表达式;
public IList<SpecialInformationEntity > SelectInformationView(string receiverName) {
var q = DataSession.Objects.Where
(c => c.ReceiverName == receiverName && c.ProcessType == 0 && c.Deleted == 0
&& c.Archived == 0 && c.IsDraft == 0 && c.ReceiverArchived == 0).OrderByDescending(c => c.ReceiveDate);
IList<SpecialInformationEntity
> list = q.Take(topCount).ToList(); if (0 < list.Count)
return list;
return null;
}