這幾天在搬磚時候用到了set()與get(),同事問了我一些問題,我打算在博客中總結一下。
覺得幫助到了您,幫我點個贊哦。
屬性訪問器
其實說白了就是操作一個屬性,更通俗一點說就是對一個變量的取值與賦值。
先來看get()
get 訪問器必須在 return 或 throw 語句中終止,并且控制不能超出訪問器體。
private int a; // 私有的變量
public int A // 公有變量,這個變量作用就是得到私有變量的值
{get {return a; //這里的return就是上邊說的必須在 return 或 throw 語句中終止}
}
現在還是不懂對吧,這個變量怎么還能加{ }里邊寫語句呢。嘿嘿就是這么神奇,就是這么規定的。
當你改變a的值,A的值也會變。
假如你在主函數當中有這么個操作:
a=5;
你會發現運行完a=5以后A也變成了5。
當你使用這個公有變量A當做右值給其他變量賦值的時候,他就會執行{ }里邊的語句。
假如你在主函數當中有這么個操作:
int B=A;
這個時候并不是把A的值直接給B,而是先執行A里邊的get(),把a的值返回給A,再將A的值傳遞給B;
這時候相當于
int B=0;
A=a;
B=A;
只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。
假如你在主函數當中有這么個操作:
int B=2;
A=B;
這個時候直接把B的值給A,但是編譯器報錯,提示A是只讀的;
當引用屬性時,除非該屬性為賦值目標,否則將調用 get 訪問器讀取該屬性的值。
白話解釋一下,當變量定義時使用get,那么變量在作為右值給其他變量賦值或者當做函數參數值時候,會先運行get里邊的語句。當做為左值被賦值時候則報錯。
現在總結一下:
1.get就是返回一個值或者說屬性;
2.在定義時使用get的變量在使用作為右值時先執行get里邊的語句返回給變量再去使用;
3.在定義時使用get的變量在使用作為左值時報錯;
不能光說不練啊,接下來寫個控制臺程序來驗證一下。
先來源碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static private int a = 3;static public int A{get { return a; }}static void Main(string[] args){int B=0;a = 5;A = 22;B = A;}}
}
這個時候編譯一下,報錯了:
錯誤 1 無法對屬性或索引器“ConsoleApplication1.Program.A”賦值 – 它是只讀的
接下來就把這句話屏蔽掉,編譯運行打斷點。
在給a賦值時候,在使用A時候打個斷點,在A的get里邊打個斷點。
運行一下看一下
先運行到:a = 5;這個時候A與a都還為3;
按F10單步再接著往下邊運行
我們驚奇的發現Aa同時變成了5
按F10單步再接著往下邊運行,就會進入get
按F10單步再接著往下邊運行,才到A給B賦值。
好啦,get我們講完啦。接下來是set
再來看set()
set 訪問器與返回 void 的方法類似。它使用稱為 value 的隱式參數,此參數的類型是屬性的類型。
private int a;
public int A
{set {a = value; }
}
當你改變A的值,a的值也會變。
假如你在主函數當中有這么個操作:
A=5;
你會發現運行完A=5以后a也變成了5。
當你使用這個公有變量A當做左值被其他變量賦值的時候,他就會執行{ }里邊的語句。
假如你在主函數當中有這么個操作:
int B=3;
A = B;
這個時候并不是只把B的值給A,還會將A的值賦值給a;
這時候相當于
int B=3;
A=B;
a=A;
只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。
假如你在主函數當中有這么個操作:
int B=2;
A=B;
這個時候直接把A的值給B,但是編譯器報錯,提示A是只寫的;
現在總結一下:
1.set改變A變量時候a的值也會改。
2.只有set屬性的變量是只讀的。
不能光說不練啊,接下來寫個控制臺程序來驗證一下。
先來源碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static private int a = 3;static public int A{set { a = value; }}static void Main(string[] args){int B = 0;A = 22;B = A;}}
}
這個時候編譯一下,報錯了:
錯誤 1 無法對屬性或索引器“ConsoleApplication1.Program.A”賦值 – 它是只讀的
接下來就把這句話屏蔽掉,編譯運行打斷點。
我們在給A賦值時打斷點,再在set處打斷點。
運行一下看一下
先運行到:a = 3;這個時候A里邊還是空的,這是因為A是只寫的沒辦法讀出來他的數值;
按F10單步再接著往下邊運行,直接先到set中,a的值變成了22。神奇吧
按F10單步再接著往下邊運行,程序結束。
好啦,get、set我們講完啦。接下來是結合在一塊。
再來看set()get()
同時帶有 get 和 set 訪問器的屬性為讀寫屬性。
private int a; // 私有的變量
public int A // 公有變量,這個變量作用就是得到私有變量的值
{get {return a; }set {a = value; }
}
經過上述講解,我們直接來看代碼,編譯調試看一下。源代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static private int a = 33;static public int A{get { return a; }set { a = value; }}static void Main(string[] args){int B;B = A;a = 55;}}
}
這個代碼自己編譯調試一下吧,自己建一個工程,直接復制過去就好了。
總結:
1、A4與a4的值,總是相等。
2、若要修改a4,則需要通過A4修改即可。a4的往往通過設置外部屬性A4值的方式,然后在A4屬性內設置一些條件,來更新a4。
3、Value的值,總是等于外部屬性A4的值。