C#類中的get 和set 函數的具體用法

來源:互聯網
上載者:User
C#語言有兩個函數--一個賦值函數(get),一個存取子(set),這從它產生的中繼語言代碼可以清晰地看到。C#不提倡將域的保護層級設為public而使使用者在類外任意操作--那樣太不OO,或者具體點說太不安全!對所有有必要在類外可見的域,C#推薦採用屬性來表達。屬性不表示儲存位置,這是屬性和域的根本性的區別。下面是一個典型的屬性設計:

using System;
class MyClass
{
int integer;
public int Integer
{
get {return integer;}
set {integer=value;}
}
}

class Test
{
public static void Main()
{
MyClass MyObject=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer++;
Console.Write(MyObject.Integer);
}
}

一如我們期待的那樣,程式輸出0 1。我們可以看到屬性通過對方法的封裝向程式員提供了一個友好的域成員的存取介面。這裡的value是C#的關鍵字,是我們進行屬性操作時的set的隱含參數,也就是我們在執行屬性寫操作時的右值。

屬性提供了唯讀(get),唯寫(set),讀寫(get和 set)三種介面操作。對域的這三種操作,我們必須在同一個屬性名稱下聲明,而不可以將它們分離,看下面的實現:

class MyClass
{
private string name;

public string Name
{
get { return name; }
}
public string Name
{
set { name = value; }
}
}

上面這種分離Name屬性實現的方法是錯誤的!我們應該像前面的例子一樣將他們放在一起。值得注意的是三種屬性(唯讀,唯寫,讀寫)被C#認為是同一個屬性名稱,看下面的例子:

class MyClass
{
protected int num=0;
public int Num
{
set
{
num=value;
}
}
}
class MyClassDerived: MyClass
{
new public int Num
{
get
{
return num;
}
}
}

class Test
{
public static void Main()
{
MyClassDerived MyObject = new MyClassDerived();
//MyObject.Num= 1; //錯誤 !
((MyClass)MyObject).Num = 1;
}
}

我們可以看到MyClassDerived中的屬性Num-get{}屏蔽了MyClass中屬性Num-set{}的定義。

當然屬性遠遠不止僅僅限於域的介面操作,屬性的本質還是方法,我們可以根據程式邏輯在屬性的提取或賦值時進行某些檢查,警告等額外操作,看下面的例子:

class MyClass
{
private string name;
public string Name
{
get { return name; }
set
{
if (value==null)
name="Microsoft";
else
name=value;
}
}
}

由於屬性的方法的本質,屬性當然也有方法的種種修飾。屬性也有5種存取修飾符,但屬性的存取修飾往往為public,否則我們也就失去了屬性作為類的公用介面的意義。除了方法的多參數帶來的方法重載等特性屬性不具備外, virtual, sealed, override, abstract等修飾符對屬性與方法同樣的行為,但由於屬性在本質上被實現為兩個方法,它的某些行為需要我們注意。看下面的例子:

abstract class A
{
int y;
public virtual int X
{
get { return 0; }
}
public virtual int Y
{
get { return y; }
set { y = value; }
}
public abstract int Z { get; set; }
}
class B: A
{
int z;
public override int X
{
get { return base.X + 1; }
}
public override int Y
{
set { base.Y = value < 0? 0: value; }
}
public override int Z
{
get { return z; }
set { z = value; }
}
}

這個例子集中地展示了屬性在繼承上下文中的某些典型行為。這裡,類A由於抽象屬性Z的存在而必須聲明為abstract。子類B中通過base關鍵字來引用父類A的屬性。類B中可以只通過Y-set便覆蓋了類A中的虛屬性。

靜態屬性和靜態方法一樣只能存取類的靜態域變數。我們也可以像做外部方法那樣,聲明外部屬性。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.