zoukankan      html  css  js  c++  java
  • 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();
    }

  • 相关阅读:
    【学相伴】Nginx最新教程通俗易懂-狂神说
    Linux基础知识总结(命令行)
    CentOS7 运维
    Linux 的基础知识回顾(安装vmware) ---- No.1 后面都以Centos8 为例
    Linux sudo权限提升漏洞(CVE-2021-3156)
    Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    矩阵的范数
    函数导出在kvm_intel.ko,kvm.ko不共享
    python 调用内部类的两种方法
    python3 字符串方法
  • 原文地址:https://www.cnblogs.com/heqichang/p/2081458.html
Copyright © 2011-2022 走看看