1. 程式人生 > >C#中的get和set 方法

C#中的get和set 方法

set()是給屬性賦值的,get()是取得屬性值的
被設定和存取的屬性一般是私有
主要是起到封裝的作用,不允許直接對屬性操作
set()和get()不一定同時存在,看程式需求

釋一:屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。

訪問器宣告可以包含 get 訪問器或 set 訪問器,或者兩者均包含。宣告採用下列形式之一:get {}set {}    get 訪問器 get 訪問器體與方法體相似。它必須返回屬性型別的值。執行 get 訪問器相當於讀取欄位的值。以下是返回私有欄位 name 的值的 get 訪問器:

類似java的私有屬性,公開方法

private string name;   // the name field

public string Name   // the Name property

    get    {      return name;    }

}

當引用屬性時,除非該屬性為賦值目標,否則將呼叫 get 訪問器讀取該屬性的值。例如:Employee e1 = new Employee();...Console.Write(e1.Name);   // The get accessor is invoked here get 訪問器必須在 return 或 throw 語句中終止,並且控制不能超出訪問器體。set 訪問器set 訪問器與返回 void 的方法類似。它使用稱為 value 的隱式引數,此引數的型別是屬性的型別。

在下例中,set 訪問器被新增到 Name 屬性:

public string Name

      get    {       return name;    } 

     set    {      name = value;    }

}

當對屬性賦值時,用提供新值的引數呼叫 set 訪問器。例如:e1.Name = "Joe";   // The set accessor is invoked here在 set 訪問器中對區域性變數宣告使用隱式引數名 (value) 是錯誤的。

備註:

屬性按如下方式,根據所使用的訪問器進行分類:只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。 只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。 同時帶有 get 和 set 訪問器的屬性為讀寫屬性。 在屬性宣告中,get 和 set 訪問器都必須在屬性體的內部宣告。使用 get 訪問器更改物件的狀態是一種錯誤的程式設計樣式。例如,以下訪問器在每次訪問 number 欄位時都產生更改物件狀態的副作用。

public int Number

   get   {      return number++;   // Don't do this   }

}

可以將 get 訪問器用於返回欄位值,或用於計算欄位值並將其返回。例如:

public string Name

    get    {      return name != null ? name : "NA";   }

}

在上述程式碼段中,如果不對 Name 屬性賦值,它將返回值 NA。示例 1此例說明如何訪問基類中被派生類中具有同一名稱的另一個屬性隱藏的屬性。

// property_hiding.cs

// Property hidingusing System;

public class BaseClass

   private string name; 

   public string Name 

{    

     get       {         return name;       } 

    set       {         name = value;       }

}

}

public class DerivedClass : BaseClass

    private string name; 

   public new string Name   // Notice the use of the new modifier 

{   

      get       {         return name;       }   

      set       {         name = value;       } 

   }

}

public class MainClass

{

   public static void Main() 

{    

    DerivedClass d1 = new DerivedClass();   

   d1.Name = "John"; // Derived class property    

      Console.WriteLine("Name in the derived class is: {0}",d1.Name);   

   ((BaseClass)d1).Name = "Mary"; // Base class property   

   Console.WriteLine("Name in the base class is: {0}",         ((BaseClass)d1).Name);  

}

}

輸出Name in the derived class is: JohnName in the base class is: Mary以下是上例中顯示的重點: 派生類中的屬性 Name 隱藏基類中的屬性 Name。在這種情況下,派生類的該屬性宣告使用 new 修飾符:    public new string Name    {   ...轉換 (BaseClass) 用於訪問基類中的隱藏屬性:    ((BaseClass)d1).Name = "Mary";

釋二: 程式碼如下:

public class Car

{

    private string color;

    public string Color

    { 

         get   {return color;    } 

           set    {color=value;    }

   }

}

我的理解是:通過GET和SET對公有變數Color進行讀寫操作,實際就是間接更改color私有變數的值,那既然如此。為何不設color為public,讓例項直接對color進行讀寫操作呢? 如果有一天,老闆讓你把這個類改成當汽車的顏色改變時,同時計算一下汽車的《價格》屬性那麼如果直接對Color操作,你不是死定了? “屬性”是.net的特色之一。其實就相當於方法,尤其是java中經常會用到get、set方法(.net的有些思想就是java的)。 屬性的真實作用不只是為了更改某個成員變數的值比如form的size屬性在set的同時要重畫form,如果你不想讓使用者對color修改,就不要提供set方法 是面向物件具有的set and get它的用途: 一般是對類裡面的變數進行操作. 而不是直接對類的變數進行操作.有一個很大的作用就是: 便於維護.因為:如果一個類的一個變數int a ,在其它包或名稱空間類中使用了1000次,但是過了許久,你想把a改為b,如果直接對變數a操作的話,就得需求修改整個程式的1000處. 如果用屬性了,就不會了,只需改這個方法即可public int A{ set {   a = value; } get {   return a; }}放為:public int B{ set {   b = value; } get {   return b; }}除去這個屬性之外的地方根本不需要改變 通過上面的講解。有一點點明白了。滿足一定條件讓GET和SET來改變類中的私有變數,而不能讓例項直接操作。像上面的程式碼保證了color屬性的安全性。既然如此可不可以寫成set{color=value*20; //value是不是相當於Color的值} 我當初和你有一樣的想法.但是現在改變了。舉個例子說明一下吧.

public class Car

{

   public string Color

     get   {   

                   if(this.viewstate["color"]!= null)  

                  {     

                         return this.viewstate["color"];    

                  }   

                         return "":  

            }  

    set    {      this.viewstate["color"];=value;    }

}

}

在asp.net中通常這麼使用.如果用變數的話就不好使用了。而且get,set中可以寫多個語句.如上的get.

相關推薦

C#getset 方法

set()是給屬性賦值的,get()是取得屬性值的 被設定和存取的屬性一般是私有 主要是起到封裝的作用,不允許直接對屬性操作 set()和get()不一定同時存在,看程式需求 釋一:屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。 訪問器宣告可以

C#GetPost請求的同步及異步方法

iter epo charset result string pty streambuf div httpget 在C#中發起Http請求一般使用HttpWebRequest這個類,下文將使用這個HttpWebRequest對象來對Get和Post的同步及異步請求進行封裝:

C#GetPost請求的同步及非同步方法

在C#中發起Http請求一般使用HttpWebRequest這個類,下文將使用這個HttpWebRequest物件來對Get和Post的同步及非同步請求進行封裝: 新建HttpRequestHelper類: public static class H

關於C++vectorset使用sort方法進行排序

C++中vector和set都是非常方便的容器, sort方法是algorithm標頭檔案裡的一個標準函式,能進行高效的排序,預設是按元素從小到大排序 將sort方法用到vector和set中能實現多種符合自己需求的排序 首先sort方法可以對靜態的陣列進行排序

MyEclipse快速生成getset方法

Shift+Alt+S快捷鍵選擇 generate getters and setters,然後選擇變數名即可新增set和get函式 或者: 在編碼區域右擊選擇---source,然後選擇generate getters and setters

有關Java實體類getset方法有參無參構造方法的個人見解。

結論:(總的來說,get和set方法就是為了能以得到和設定實體類中的私有屬性值,而一個類中至少要有一個構造方法,當沒有人為新增的時候,編譯器會自動加入一個隱式的無參構造方法,當有人為新增時,編譯器就不會自動添加了。無參構造方法的作用是為了比較方便的new出一個物

關於面向物件程式設計很多人用get()set()方法,而不用public的一點總結

在很多程式中,都喜歡定義一個privata變數,然後為這個私有變數加上get(),set()方法。那為什麼不直接定義一個public變數呢?這樣做到底有什麼好處和意義呢?難道真的僅僅只是為了程式碼規範?別逗了,不管你信不信,反正我是不信!帶著這個問題我在網上尋找答案,真是眾

javagetset方法(比較詳細)

屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。訪問器宣告可以包含 get 訪問器或 set 訪問器,或者兩者均包含。宣告採用下列形式之一: set {accessor-body} get {accessor-body} 其中: accessor-bod

VS自動生成屬性getset方法

http://blog.sina.com.cn/s/blog_62ff35cc010190wi.html 今天發現了一個很好用的快捷建,ctrl+R,ctrl+E這兩個組合鍵,可以自動生成屬性中的get和set方法。和java語法不同的是,除了get/set方法的寫法上,還

C#封裝:關於欄位屬性的getset方法的小總結

----以下only個人學習完C#與JAVA時對屬性中set 和 get方法的一些個人總結,如有誤導或者不足之處,還請各位在評論區連嘲帶諷的指出(不然咱沒進步的空間啊T _ T)------前提須知: 只有get方法叫只讀屬性,只有set方法叫只寫屬性,兩個方法都存在叫可讀

根據屬性拿到getset方法

rop start getname code color readme stat end 沒有 public static void method(Object obj) { try { Class<? extend

servlet表單getpost方法的區別

pos span 轉化 不可見 上傳文件 post div font 支持 Form中的get和post方法,在數據傳輸過程中分別對應了HTTP協議中的GET和POST方法。二者主要區別如下:1、Get是用來從服務器上獲得數據,而Post是用來向服務器上傳遞數據。2、Get

Swift getset方法以及只讀屬性(計算型屬性,本身不保存數據,都是通過計算獲得結果)

get bsp 簡寫 保存數據 value string nsobject var import import UIKit class Person: NSObject { private var _name: String? var name: Strin

淺析c#==操作符equals方法

邏輯 mce 需求 ram margin width 通過 否則 可用   在之前的文章中,我們講到了使用C#中提供的Object類的虛Equals方法來判斷Equality,但實際上它還提供了另外一種判斷Equality的方法,那就是使用==運算符。許多童鞋也許會想當然的

第02講 struts2的getset方法自動獲取自動設定資料

第二章設定資料 1,複製專案HeadFirstStruts2chapter01 改名為:HeadFirstStruts2chapter02。修改Web Project Settings 為HeadFirstStruts2chapter02,HelloWorldAction中設定成員變數name屬

vue.js getset方法使用

  vue.js get和set方法使用   ================================ ©Copyright 蕃薯耀 2018年12月05日 http://fanshuyao.iteye.com/   <!DOCTYPE ht

HTTPGETPOST方法的區別

HTTP請求的方法有很多:GET、POST、HEAD、TRACE、OPTIONS等,但是GET和POST是兩個最常用的方法。 GET是最簡單的一種請求方法,其主要功能是從伺服器端獲取使用者所需資源,並將其作為響應返回給客戶端,需要注意的是:GET方法的作用主要用來獲取伺

C++mapset的使用與區別

set set是一種關聯式容器,其特性如下: set以RBTree作為底層容器 所得元素的只有key沒有value,value就是key 不允許出現鍵值重複 所有的元素都會被自動排序 不能通過迭代器來改變set的值,因為set的值就是鍵 針對這五點來說,

Hibernategetload方法的區別

load方法可返回沒有載入實體資料的代理類例項,而get方法永遠返回有實體資料的物件。(對於load和get方法返回型別:好多書中都說:“get方法永遠只返回實體類”,實際上並不正確,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被代理過的,如被load方法使用過,或者被其他

Java反射獲取getset方法

反射bean的get方法 /** * java反射bean的get方法 * * @param objectClass * @param fieldName * @return */