程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 深刻講授C#編程中嵌套類型和匿名類型的界說與應用

深刻講授C#編程中嵌套類型和匿名類型的界說與應用

編輯:C#入門知識

深刻講授C#編程中嵌套類型和匿名類型的界說與應用。本站提示廣大學習愛好者:(深刻講授C#編程中嵌套類型和匿名類型的界說與應用)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻講授C#編程中嵌套類型和匿名類型的界說與應用正文


嵌套類型

在類或構造外部界說的類型稱為嵌套類型。例如:

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

不論內部類型是類照樣構造,嵌套類型均默許為 private,然則可以設置為 public、protected internal、protected、internal 或 private。在下面的示例中,Nested 對內部類型是弗成拜訪的,但可以設置為 public,以下所示:

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

嵌套類型(或外部類型)可拜訪包括類型(或內部類型)。若要拜訪包括類型,請將其作為結構函數傳遞給嵌套類型。例如:

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

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

嵌套類型可以拜訪其包括類型可以拜訪的一切成員。它可以拜訪包括類型的公有成員和受掩護成員(包含一切繼續的受掩護成員)。
在後面的聲明中,類 Nested 的完全稱號為 Container.Nested。這是用來創立嵌套類新實例的稱號,以下所示:

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


匿名類型
匿名類型供給了一種便利的辦法,可用來將一組只讀屬性封裝到單個對象中,而無需起首顯式界說一個類型。類型名由編譯器生成,而且不克不及在源代碼級應用。每一個屬性的類型由編譯器揣摸。
可經由過程應用 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);

匿名類型平日用在查詢表達式的 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);
}

平日,當你應用匿名類型來初始化變量時,可以經由過程應用 var 將變量作為隱式鍵入的當地變來變量停止聲明。類型稱號沒法在變量聲明中給出,由於只要編譯器能拜訪匿名類型的基本稱號。有關 var的具體信息,請參閱隱式類型的部分變量(C# 編程指南)。
可經由過程將隱式鍵入的當地變量與隱式鍵入的數組相聯合創立匿名鍵入的元素的數組,以下面的示例所示。

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

備注
匿名類型是直接從對象派生的類類型,而且其沒法強迫轉換為除對象外的隨意率性類型。固然你的運用法式不克不及拜訪它,編譯器照樣供給了每個匿名類型的稱號。從公共說話運轉時的角度來看,匿名類型與任何其他援用類型沒有甚麼分歧。
假如法式集中的兩個或多個匿名對象初始值指定了屬性序列,這些屬性采取雷同次序且具有雷同的稱號和類型,則編譯器將對象視為雷同類型的實例。它們同享統一編譯器生成的類型信息。
沒法將字段、屬性、時光或辦法的前往類型聲明為具有匿名類型。異樣,你不克不及將辦法、屬性、結構函數或索引器的形參聲明為具有匿名類型。要將匿名類型或包括匿名類型的聚集作為參數傳遞給某一辦法,可將參數作為類型對象停止聲明。然則,如許做會使強類型化感化有效。假如必需存儲查詢成果或許必需將查詢成果傳遞到辦法界限內部,請斟酌應用通俗的定名構造或類而不是匿名類型。
因為匿名類型上的 Equals 和 GetHashCode 辦法是依據辦法屬性的 Equals 和 GetHashCode 界說的,是以僅當統一匿名類型的兩個實例的一切屬性都相等時,這兩個實例才相等。

在查詢中前往元素屬性的子集
當以下兩個前提都知足時,可在查詢表達式中應用匿名類型:
您只想前往每一個源元素的某些屬性。
您無需在履行查詢的辦法的規模以外存儲查詢成果。
假如您只想從每一個源元素中前往一個屬性或字段,則只需在 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);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved