Tutorialsteacher

关注我们

文章
  • C#
  • C# 面向对象编程
  • ASP.NET Core
  • ASP.NET MVC
  • LINQ
  • 控制反转 (IoC)
  • Web API
  • JavaScript
  • TypeScript
  • jQuery
  • Angular 11
  • Node.js
  • D3.js
  • Sass
  • Python
  • Go 语言
  • HTTPS (SSL)
  • 正则表达式
  • SQL
  • SQL Server
  • PostgreSQL
  • MongoDB
  • C# - 入门
  • C# - 版本历史
  • C# - 第一个程序
  • C# - 关键词
  • C# - 类和对象
  • C# - 命名空间
  • C# - 变量
  • C# - 隐式类型变量
  • C# - 数据类型
  • 数字
  • 字符串
  • DateTime
  • 结构体
  • 枚举
  • StringBuilder
  • 匿名类型
  • 动态类型
  • 可空类型
  • C# - 值类型和引用类型
  • C# - 接口
  • C# - 运算符
  • C# - if else 语句
  • C# - 三元运算符 ?
  • C# - Switch 语句
  • C# - For 循环
  • C# - While 循环
  • C# - Do-while 循环
  • C# - 分部类
  • C# - Static 关键字
  • C# - 数组
  • 多维数组
  • 交错数组
  • C# - 索引器
  • C# - 泛型
  • 泛型约束
  • C# - 集合
  • ArrayList
  • List
  • SortedList
  • Dictionary
  • Hashtable
  • Stack
  • Queue
  • C# - 元组 (Tuple)
  • C# - 值元组 (ValueTuple)
  • C# - 内置异常
  • 异常处理
  • throw 关键字
  • 自定义异常
  • C# - 委托
  • Func 委托
  • Action 委托
  • Predicate 委托
  • 匿名方法
  • C# - 事件
  • C# - 协变
  • C# - 扩展方法
  • C# - 流 I/O
  • C# - File 类
  • C# - FileInfo 类
  • C# - 对象初始化器
  • OOP - 概述
  • 面向对象编程
  • 抽象
  • 封装
  • 关联与组合
  • 继承
  • 多态
  • 方法重写
  • 方法隐藏
  • C# - SOLID 原则
  • 单一职责原则
  • 开闭原则
  • 里氏替换原则
  • 接口隔离原则
  • 依赖倒置原则
  • 设计模式
  • 单例模式
  • 抽象工厂模式
  • 工厂方法模式
Entity Framework Extensions - 提升 EF Core 9
  批量插入
  批量删除
  批量更新
  批量合并

C# - 匿名类型


更新于:2020年5月2日

在 C# 中,匿名类型是一种没有名称的类型(类),它只能包含公共的只读属性。它不能包含其他成员,例如字段、方法、事件等。

您可以使用 `new` 运算符和对象初始化器语法来创建匿名类型。隐式类型变量 `var` 用于保存匿名类型的引用。

以下示例演示了创建一个匿名类型变量 `student`,该变量包含三个名为 `Id`、`FirstName` 和 `LastName` 的属性。

示例:匿名类型
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };

匿名类型的属性是只读的,不能用 null、匿名函数或指针类型初始化。属性可以使用点号 (.) 访问,与对象属性相同。但是,由于属性是只读的,您无法更改属性的值。

示例:访问匿名类型
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Console.WriteLine(student.Id); //output: 1
Console.WriteLine(student.FirstName); //output: James
Console.WriteLine(student.LastName); //output: Bond

student.Id = 2;//Error: cannot chage value
student.FirstName = "Steve";//Error: cannot chage value
尝试一下

匿名类型的属性可以包含另一个匿名类型。

示例:嵌套匿名类型
var student = new { 
                    Id = 1, 
                    FirstName = "James", 
                    LastName = "Bond",
                    Address = new { Id = 1, City = "London", Country = "UK" }
                };

您还可以创建匿名类型的数组。

示例:匿名类型数组
var students = new[] {
            new { Id = 1, FirstName = "James", LastName = "Bond" },
            new { Id = 2, FirstName = "Steve", LastName = "Jobs" },
            new { Id = 3, FirstName = "Bill", LastName = "Gates" }
    };

匿名类型将始终是其定义方法的局部类型。它不能从方法返回。但是,匿名类型可以作为对象类型参数传递给方法,但不推荐这样做。如果需要将其传递给另一个方法,请使用结构或类而不是匿名类型。

大多数情况下,匿名类型是使用 LINQ 查询的 Select 子句创建的,用于从集合中的每个对象返回属性的子集。

示例:LINQ 查询返回匿名类型
class Program
{
    static void Main(string[] args)
    {
        IList<Student> studentList = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", age = 18 },
            new Student() { StudentID = 2, StudentName = "Steve",  age = 21 },
            new Student() { StudentID = 3, StudentName = "Bill",  age = 18 },
            new Student() { StudentID = 4, StudentName = "Ram" , age = 20  },
            new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } 
        };

        var students = from s in studentList
                       select new { Id = s.StudentID, Name = s.StudentName };

        foreach(var stud in students)
            Console.WriteLine(stud.Id + "-" + stud.Name);
    }
}

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int age { get; set; }
}
尝试一下
输出
1-John
2-Steve
3-Bill
4-Ram
5-Ron

在上面的示例中,LINQ 查询中的 select 子句只选择 `StudentID` 和 `StudentName` 属性,并将其分别重命名为 `Id` 和 `Name`。因此,它有助于节省内存和不必要的代码。查询结果集合只包含 `StudentID` 和 `StudentName` 属性,如下面的调试视图所示。

Visual Studio 支持匿名类型的 IntelliSense,如下所示。

Anonymous Type Intellisense Support in Visual Studio

在内部,所有匿名类型都直接派生自 `System.Object` 类。编译器会生成一个具有自动生成名称的类,并根据值表达式为每个属性应用适当的类型。尽管您的代码无法访问它。使用 `GetType()` 方法查看名称。

示例:匿名类型的内部名称
static void Main(string[] args)
{
    var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
    Console.WriteLine(student.GetType().ToString());
}
尝试一下
TUTORIALSTEACHER.COM

TutorialsTeacher.com 是您权威的技术教程来源,旨在通过循序渐进的方法,指导您掌握各种网络和其他技术。

我们的内容旨在帮助各个级别的学习者轻松快速地学习技术。访问此平台即表示您已阅读并同意遵守我们的使用条款和隐私政策,这些条款和政策旨在保护您的体验和隐私权。

[email protected]

关于我们使用条款隐私政策
copywrite-symbol

2024 TutorialsTeacher.com. (v 1.2) 版权所有。