程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#3.0新特性(三)-詳說自動屬性和匿名類型(1)

C#3.0新特性(三)-詳說自動屬性和匿名類型(1)

編輯:關於C語言

寫在前邊:

不知道怎麼的,上一篇說放到首頁看看,今天來看才發現沒有放上去,做事情還真不細心,改、改、改!其實,早知道C# 4.0都有了,但是連C# 3.0都還沒有弄清楚,使用還是堅持這個系列,做完再寫C# 4.0吧。技術前輩們肯定早都知道這些東西了,不過呢,我也只是學習,只是把我的學習同大家分享而已!

一、自動實現的屬性

全稱應該叫自動實現的屬性(Auto-implemented propertIEs),在上一篇中,給了簡單的例子,說的是當屬性訪問器中不需要其他邏輯時,自動實現的屬性可使屬性聲明變得更加簡潔。如前邊的例子,在C# 2.0中:

private int m_one;
public int One
{
  get { return m_one; }
  set { m_one = value; }
}

這個屬性只有存(set)取(get)邏輯,沒有其它諸如動態分配、或是按條件存取的邏輯,在C# 3.0中,完全可以寫成:

public int One { get; set; }

從而不需要創建與該屬性對應的私有變量。

自動實現的屬性必須同時聲明get和set訪問器。若要創建readonly自動實現屬性,請給予它private set訪問器。如:

public string Name { get; private set; }

這樣,這個屬性只讀,不能對其進行存操作。那有人肯定要問,要給Name賦值,怎麼辦。仔細理解這個private set的含義,在面向對象的概念中,private表示在自己類的內部還是可以訪問的,也就是,這裡說的只讀屬性,在定義這個屬性的類本身中,還是可以訪問的,如下:

public class EDClass
{
  public string Name { get; private set; }
  public EDClass()
  {
    Name = "QQ";
  }
  public void setName()
  {
    Name = "QQ";
  }
}

這樣是完全沒有問題的,但是,如果通過obj.Name = value肯定不行的,要不然就不叫readonly了。例如:

EDClass cls = new EDClass();
cls.Name = "QQ";

報錯:The property or indexer 'CSharpStudy.EDClass.Name' cannot be used in this context because the set accessor is inAccessible

還有一點需要說明,自動實現的屬性(Property) 不允許具有屬性 (Attribute)。如果您必須在屬性(Property) 的後備字段上使用屬性(Attribute),則應該只創建常規屬性(Property)。好繞口,仔細分析這些概念,在面向對象的概念中,類的成員(member)又稱為屬性(Attribute),其實,在一般來講,在C++中稱為成員(Member)變量,在C#中稱為屬性(Attribute),或字段。而這裡的自動屬性用的是Property,試想,定義了一個自動屬性:

public string Name { get; set; }

又想定義一個私有成員(屬性,Attribute)與之關聯:

private string _name;

不會報錯,但是肯定關聯不了,它只被認為是類的一個私有成員變量

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