Linq学习总结(1)——匿名类型

匿名类型关键字var
var关键字,可以把它理解为类型占位符,它并不是C#中的一种基本类型。它能在你编写程序的时候,自动计算出等式右边的类型,而且支持智能感知。
//可以是整型
var vInt = 123;

//可以是字符串
var vString = "Hello Var!";

//可以是日期类型
var vDateTime = new DateTime();

//甚至可以是一个数组
var vIntArray = new int[] { 1, 2, 3, 4, 5, 6 };
但需要注意的是,一旦指明类型之后,不能再更改它的类型了,否则将报错。
//将它指定为整型
var vInt = 123;

//这样就不行了,第一次指定类型之后,vInt就被指定为int类型了,而不能将string值为它赋值
vInt = "string";

注意事项
  • 匿名类型必须初始化,且不能被初始化为null。
但是却可以这样初始化null:
var vString = (String)null;
其实等价于下面这段代码:
String vString = null;
  • 匿名类型可以用于简单类型,也可以用于复杂类型。定义复合匿名类型时需要有成员声明。
//Name和Age就是一个成员声明
var student = new { Name = "James", Age = 27 };
  • 匿名类型不能定义为类成员变量。
  • 方法可以返回匿名类型。
static object getStudent()
{
var student
= new { Name = "James", Age = 27 };
return student;
}
但是调用起来就比较麻烦了
static void Main(String[] args)
{
Object student
= getStudent();
Console.WriteLine(
"Name:{0}\nAge:{1}",
student.GetType().GetProperty(
"Name").GetValue(student,null),
student.GetType().GetProperty(
"Age").GetValue(student, null));
}
一些匿名类型的使用技巧
 
  •  为匿名类型增加一个方法
我们不能直接在匿名类型中这样做,但可以通过一些间接的手段。
 
static void Main(String[] args)
{

Action
<String> printName = delegate(String name)
{
Console.WriteLine(
"Welcome {0}",name);
};

var customer
= new { Name = "James", WelcomeInfo = printName };

//智能感知已经发现了这个方法,我们可以像平常那样去调用了
customer.WelcomeInfo(customer.Name);

}
 
  • 匿名类型也能进行数据绑定
 
private void Form1_Load(object sender, EventArgs e)
{
UpdateDate();
}

private void UpdateDate()
{
var student1
= new { Name = "Liu", Age = 14 };
var student2
= new { Name = "Guan", Age = 12 };
var student3
= new { Name = "Zhang", Age = 13 };

var students
= new List<object> { student1, student2, student3 };

dataGridView1.DataSource
= students;
}
  • 匿名类型相等性测试

static void Main(String[] args)
{
var student1
= new { Name = "Liu", Age = 14 };
var student2
= new { Name = "Liu", Age = 14 };
var student3
= new { Name = "Zhang", Age = 14 };
var student4
= new { Age = 14, Name = "Liu" };

Console.WriteLine(student1.Equals(student2));
Console.WriteLine(student1.Equals(student3));
Console.WriteLine(student1.Equals(student4));

//输出结果 true , false , false
}

  • 使用匿名方法递归

static void Main(String[] args)
{
Func
<long, long> factorial = delegate(long n)
{
return n > 1 ? n * (long)(new StackTrace().GetFrame(0).GetMethod()
          .Invoke(null, new object[] { n - 1 })) : n;
};

Console.WriteLine(factorial(
5));
Console.ReadKey();
}

posted @ 2011-06-15 14:47  heqichang  阅读(2712)  评论(4编辑  收藏  举报