最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入講解C#編程中嵌套類型和匿名類型的定義與使用

 更新時間:2016年01月31日 15:27:41   投稿:goldensun  
這篇文章主要介紹了C#編程中嵌套類型和匿名類型的定義與使用,包括在SQL語句中使用匿名類型的方法,需要的朋友可以參考下

嵌套類型

在類或結(jié)構(gòu)內(nèi)部定義的類型稱為嵌套類型。例如:

class Container
{
  class Nested
  {
    Nested() { }
  }
}

不管外部類型是類還是結(jié)構(gòu),嵌套類型均默認(rèn)為 private,但是可以設(shè)置為 public、protected internal、protected、internal 或 private。在上面的示例中,Nested 對外部類型是不可訪問的,但可以設(shè)置為 public,如下所示:

class Container
{
  public class Nested
  {
    Nested() { }
  }
}

嵌套類型(或內(nèi)部類型)可訪問包含類型(或外部類型)。若要訪問包含類型,請將其作為構(gòu)造函數(shù)傳遞給嵌套類型。例如:

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

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

嵌套類型可以訪問其包含類型可以訪問的所有成員。它可以訪問包含類型的私有成員和受保護(hù)成員(包括所有繼承的受保護(hù)成員)。
在前面的聲明中,類 Nested 的完整名稱為 Container.Nested。這是用來創(chuàng)建嵌套類新實例的名稱,如下所示:

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


匿名類型
匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。類型名由編譯器生成,并且不能在源代碼級使用。每個屬性的類型由編譯器推斷。
可通過使用 new 運算符和對象初始值創(chuàng)建匿名類型。
以下示例顯示了用兩個名為 Amount 和 Message 的屬性進(jìn)行初始化的匿名類型。

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);

匿名類型通常用在查詢表達(dá)式的 select 子句中,以便返回源序列中每個對象的屬性子集。
匿名類型包含一個或多個公共只讀屬性。包含其他種類的類成員(如方法或事件)為無效。用來初始化屬性的表達(dá)式不能為 null、匿名函數(shù)或指針類型。
最常見的方案是用其他類型的屬性初始化匿名類型。在下面的示例中,假定名為 Product 的類存在。類 Product 包括 Color 和 Price 屬性,以及你不感興趣的其他屬性。變量 products 是 Product 對象的集合。匿名類型聲明以 new 關(guān)鍵字開始。聲明初始化了一個只使用 Product 的兩個屬性的新類型。這將導(dǎo)致在查詢中返回較少數(shù)量的數(shù)據(jù)。
如果你沒有在匿名類型中指定成員名稱,編譯器會為匿名類型成員指定與用于初始化這些成員的屬性相同的名稱。必須為使用表達(dá)式初始化的屬性提供名稱,如下面的示例所示。在下面示例中,匿名類型的屬性名稱都為 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);
}

通常,當(dāng)你使用匿名類型來初始化變量時,可以通過使用 var 將變量作為隱式鍵入的本地變來變量進(jìn)行聲明。類型名稱無法在變量聲明中給出,因為只有編譯器能訪問匿名類型的基礎(chǔ)名稱。有關(guān) var的詳細(xì)信息,請參閱隱式類型的局部變量(C# 編程指南)。
可通過將隱式鍵入的本地變量與隱式鍵入的數(shù)組相結(jié)合創(chuàng)建匿名鍵入的元素的數(shù)組,如下面的示例所示。

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

備注
匿名類型是直接從對象派生的類類型,并且其無法強制轉(zhuǎn)換為除對象外的任意類型。雖然你的應(yīng)用程序不能訪問它,編譯器還是提供了每一個匿名類型的名稱。從公共語言運行時的角度來看,匿名類型與任何其他引用類型沒有什么不同。
如果程序集中的兩個或多個匿名對象初始值指定了屬性序列,這些屬性采用相同順序且具有相同的名稱和類型,則編譯器將對象視為相同類型的實例。它們共享同一編譯器生成的類型信息。
無法將字段、屬性、時間或方法的返回類型聲明為具有匿名類型。同樣,你不能將方法、屬性、構(gòu)造函數(shù)或索引器的形參聲明為具有匿名類型。要將匿名類型或包含匿名類型的集合作為參數(shù)傳遞給某一方法,可將參數(shù)作為類型對象進(jìn)行聲明。但是,這樣做會使強類型化作用無效。如果必須存儲查詢結(jié)果或者必須將查詢結(jié)果傳遞到方法邊界外部,請考慮使用普通的命名結(jié)構(gòu)或類而不是匿名類型。
由于匿名類型上的 Equals 和 GetHashCode 方法是根據(jù)方法屬性的 Equals 和 GetHashCode 定義的,因此僅當(dāng)同一匿名類型的兩個實例的所有屬性都相等時,這兩個實例才相等。

在查詢中返回元素屬性的子集
當(dāng)下列兩個條件都滿足時,可在查詢表達(dá)式中使用匿名類型:
您只想返回每個源元素的某些屬性。
您無需在執(zhí)行查詢的方法的范圍之外存儲查詢結(jié)果。
如果您只想從每個源元素中返回一個屬性或字段,則只需在 select 子句中使用點運算符。例如,若要只返回每個 student 的 ID,可以按如下方式編寫 select 子句:

select student.ID;

下面的示例演示如何使用匿名類型只返回每個源元素的符合指定條件的屬性子集。

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);
  }
}

輸出:

Adams, Terry
Fakhouri, Fadi
Garcia, Cesar
Omelchenko, Svetlana
Zabokritski, Eugene

請注意,如果未指定名稱,則匿名類型將使用源元素的名稱作為其屬性名稱。若要為匿名類型中的屬性指定新名稱,請按如下方式編寫 select 語句:

select new { First = student.FirstName, Last = student.LastName };

如果您在上一個示例中這樣做,則 Console.WriteLine 語句也必須更改:

Console.WriteLine(student.First + " " + student.Last);

相關(guān)文章

  • Unity3D實現(xiàn)物體排成弧行

    Unity3D實現(xiàn)物體排成弧行

    這篇文章主要為大家詳細(xì)介紹了Unity3D實現(xiàn)物體排成弧行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#中的委托、事件學(xué)習(xí)筆記

    C#中的委托、事件學(xué)習(xí)筆記

    這篇文章主要介紹了C#中的委托、事件學(xué)習(xí)筆記,本文講解了委托delegate、事件的相關(guān)知識并給出代碼實例,需要的朋友可以參考下
    2015-01-01
  • C#?winForm自定義彈出頁面效果

    C#?winForm自定義彈出頁面效果

    這篇文章主要為大家詳細(xì)介紹了C#?winForm自定義彈出頁面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c#使用linq把多列的List轉(zhuǎn)化為只有指定列的List

    c#使用linq把多列的List轉(zhuǎn)化為只有指定列的List

    這篇文章主要介紹了c#使用linq把多列的List轉(zhuǎn)化為只有指定列的List,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#引用類型作為方法的參數(shù)分析

    C#引用類型作為方法的參數(shù)分析

    這篇文章主要介紹了C#引用類型作為方法的參數(shù)分析,以實例的形式較為詳細(xì)的分析了參數(shù)的傳值問題,需要的朋友可以參考下
    2014-11-11
  • 基于C#實現(xiàn)進(jìn)程回收管理工具

    基于C#實現(xiàn)進(jìn)程回收管理工具

    這篇文章主要為大家詳細(xì)介紹了入戶基于C#實現(xiàn)一個進(jìn)程回收管理工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Unity UI拖拽模型選擇功能

    Unity UI拖拽模型選擇功能

    這篇文章主要為大家詳細(xì)介紹了Unity UI拖拽模型選擇功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C#實現(xiàn)關(guān)機功能

    C#實現(xiàn)關(guān)機功能

    這篇文章介紹了C#實現(xiàn)關(guān)機功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#實現(xiàn)窗體抖動的兩種方法

    C#實現(xiàn)窗體抖動的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)窗體抖動的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 使用C#代碼重新排列PDF頁面的操作代碼

    使用C#代碼重新排列PDF頁面的操作代碼

    對于頁面順序混亂的 PDF 文檔,重新排列頁面可以避免讀者產(chǎn)生困惑,同時也能讓文檔結(jié)構(gòu)更加清晰有序,本文將演示如何使用 Spire.PDF for .NET 以編程方式重新排列現(xiàn)有 PDF 文檔中的頁面,需要的朋友可以參考下
    2025-12-12

最新評論

宝兴县| 罗江县| 宜章县| 易门县| 商河县| 筠连县| 富裕县| 深水埗区| 靖安县| 故城县| 建瓯市| 文安县| 吕梁市| 桃园县| 宜兴市| 堆龙德庆县| 芦山县| 定襄县| 繁峙县| 沂南县| 湘潭市| 兴宁市| 隆德县| 白银市| 资阳市| 上林县| 新宁县| 永顺县| 东莞市| 汶上县| 双鸭山市| 郯城县| 青冈县| 洛隆县| 西安市| 瑞金市| 五台县| 务川| 康马县| 邛崃市| 荆门市|