• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

深入讲解C#编程中嵌套类型和匿名类型的定义与使用

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了深入讲解,深入讲解男女关系,女教授深入讲解男女,女教授深入讲解,深入讲解狗交要领等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

嵌套类型

在类或结构内部定义的类型称为嵌套类型。例如:

class Container
{
  class Nested
  {
    Nested() { }
  }
}
</div>

不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private。在上面的示例中,Nested 对外部类型是不可访问的,但可以设置为 public,如下所示:

class Container
{
  public class Nested
  {
    Nested() { }
  }
}
</div>

嵌套类型(或内部类型)可访问包含类型(或外部类型)。若要访问包含类型,请将其作为构造函数传递给嵌套类型。例如:

public class Container
{
  public class Nested
  {
    private Container parent;

    public Nested()
    {
    }
    public Nested(Container parent)
    {
      this.parent = parent;
    }
  }
}

</div>

嵌套类型可以访问其包含类型可以访问的所有成员。它可以访问包含类型的私有成员和受保护成员(包括所有继承的受保护成员)。
在前面的声明中,类 Nested 的完整名称为 Container.Nested。这是用来创建嵌套类新实例的名称,如下所示:

Container.Nested nest = new Container.Nested();

</div>


匿名类型
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。
可通过使用 new 运算符和对象初始值创建匿名类型。
以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型。

var v = new { Amount = 108, Message = "Hello" };

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

</div>

匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。
匿名类型包含一个或多个公共只读属性。包含其他种类的类成员(如方法或事件)为无效。用来初始化属性的表达式不能为 null、匿名函数或指针类型。
最常见的方案是用其他类型的属性初始化匿名类型。在下面的示例中,假定名为 Product 的类存在。类 Product 包括 Color 和 Price 属性,以及你不感兴趣的其他属性。变量 products 是 Product 对象的集合。匿名类型声明以 new 关键字开始。声明初始化了一个只使用 Product 的两个属性的新类型。这将导致在查询中返回较少数量的数据。
如果你没有在匿名类型中指定成员名称,编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。必须为使用表达式初始化的属性提供名称,如下面的示例所示。在下面示例中,匿名类型的属性名称都为 Color 和 Price。

var productQuery = 
  from prod in products
  select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
  Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

</div>

通常,当你使用匿名类型来初始化变量时,可以通过使用 var 将变量作为隐式键入的本地变来变量进行声明。类型名称无法在变量声明中给出,因为只有编译器能访问匿名类型的基础名称。有关 var的详细信息,请参阅隐式类型的局部变量(C# 编程指南)。
可通过将隐式键入的本地变量与隐式键入的数组相结合创建匿名键入的元素的数组,如下面的示例所示。

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};
</div>

备注
匿名类型是直接从对象派生的类类型,并且其无法强制转换为除对象外的任意类型。虽然你的应用程序不能访问它,编译器还是提供了每一个匿名类型的名称。从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有什么不同。
如果程序集中的两个或多个匿名对象初始值指定了属性序列,这些属性采用相同顺序且具有相同的名称和类型,则编译器将对象视为相同类型的实例。它们共享同一编译器生成的类型信息。
无法将字段、属性、时间或方法的返回类型声明为具有匿名类型。同样,你不能将方法、属性、构造函数或索引器的形参声明为具有匿名类型。要将匿名类型或包含匿名类型的集合作为参数传递给某一方法,可将参数作为类型对象进行声明。但是,这样做会使强类型化作用无效。如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。
由于匿名类型上的 Equals 和 GetHashCode 方法是根据方法属性的 Equals 和 GetHashCode 定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。

在查询中返回元素属性的子集
当下列两个条件都满足时,可在查询表达式中使用匿名类型:
您只想返回每个源元素的某些属性。
您无需在执行查询的方法的范围之外存储查询结果。
如果您只想从每个源元素中返回一个属性或字段,则只需在 select 子句中使用点运算符。例如,若要只返回每个 student 的 ID,可以按如下方式编写 select 子句:

select student.ID;
</div>

下面的示例演示如何使用匿名类型只返回每个源元素的符合指定条件的属性子集。

private static void QueryByScore()
{
  // Create the query. var is required because
  // the query produces a sequence of anonymous types.
  var queryHighScores =
    from student in students
    where student.ExamScores[0] > 95
    select new { student.FirstName, student.LastName };

  // Execute the query.
  foreach (var obj in queryHighScores)
  {
    // The anonymous type's properties were not named. Therefore 
    // they have the same names as the Student properties.
    Console.WriteLine(obj.FirstName + ", " + obj.LastName);
  }
}

</div>

输出:

Adams, Terry
Fakhouri, Fadi
Garcia, Cesar
Omelchenko, Svetlana
Zabokritski, Eugene
</div>

请注意,如果未指定名称,则匿名类型将使用源元素的名称作为其属性名称。若要为匿名类型中的属性指定新名称,请按如下方式编写 select 语句:

select new { First = student.FirstName, Last = student.LastName };
</div>

如果您在上一个示例中这样做,则 Console.WriteLine 语句也必须更改:

Console.WriteLine(student.First + " " + student.Last);
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

相关文章

  • 2017-05-28浅谈C#中的for循环与foreach循环
  • 2017-05-28C#递归实现回文判断算法
  • 2017-05-28C#集合遍历时删除和增加元素的方法
  • 2017-05-28C#中倒序输出字符串的方法示例
  • 2017-05-28C#验证码问题的快速解决方法
  • 2017-05-28C#监控文件夹并自动给图片文件打水印的方法
  • 2017-05-28c#动态改变webservice的url访问地址
  • 2017-05-28WinForm实现仿视频播放器左下角滚动新闻效果的方法
  • 2017-05-28C# 清除cookies的代码
  • 2017-05-28C#编程实现连接ACCESS数据库实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现复杂XML的序列化与反序列化
    • C# 去除首尾字符或字符串的方法
    • 关于System.Convert的那些事儿
    • WinForm窗体调用WCF服务窗体卡死问题
    • C# 动态加载程序集信息
    • C#实现Socket通信的解决方法
    • 在C#中如何使用正式表达式获取匹配所需数据
    • C#编程自学之数据类型和变量二
    • C#中重载与重写区别分析
    • 关于C#.net winform程序验证moss的集成身份认证实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有