c#中get set 的使用

来源:http://www.cnblogs.com/gallen-n/archive/2016/05/17/5502806.html
-Advertisement-
Play Games

在早期學習c#的過程中,經常遇到這樣的語句: public string StudentName { get{return stuName;} set{stuName=value;} } 當時也不是很明白為什麼要這樣?學深了c#後,又沒法對其做一個總結。今天看了《Visual c#.net程式設計教 ...


在早期學習c#的過程中,經常遇到這樣的語句:

public string StudentName

{

      get{return stuName;}

      set{stuName=value;}

}

當時也不是很明白為什麼要這樣?學深了c#後,又沒法對其做一個總結。今天看了《Visual c#.net程式設計教程》這本書,總結得不錯,做下筆記:在許多面向對象程式設計語言中,屬性 { Student stu = new Student(); Console.Write(stu.StudentName); Console.ReadKey(); } } }

上面代碼中定義了一個屬性StudentName,它包含get訪問器和set訪問器。屬性StudentName封裝了類Student中的欄位stuName,欄位如果沒有加訪問控制符,被預設為private,外界不能直接訪問它,現在外界可以通過StudentNamee屬性自由地存取 stuName欄位了。

 

屬性的get和set都是可執行的程式語句組合,具有行為的特點;而使用具有get訪問器和set訪問器的屬性時候就像使用欄位一樣,即可以作為左值接受數據,又可以作為右值輸出數據,系統正是按照屬性出現在語句中的位置,自動地選擇是調用get還是調用set。

 

屬性的讀寫控制

        屬性中的get和set可以只用一個,如果只有get而沒有set,那麼這個屬性只可讀出,不可寫入;如果只有set而沒有get,那麼這個屬性是只寫入,不可讀出。

在屬性中完成更多功能

        既然get和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 hiding
using 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: John
Name in the base class is: Mary
以下是上例中顯示的重點: 
派生類中的屬性 Name 隱藏基類中的屬性 Name。在這種情況下,派生類的該屬性聲明使用 new 修飾符: 
   public new string Name 
   {
   ...
轉換 (BaseClass) 用於訪問基類中的隱藏屬性: 
   ((BaseClass)d1).Name = "Mary";

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

在類中定義一個屬性 
public class Student 

private string name 
public string Name 

set{name=value;}//這裡是給私有屬性name賦值 
get{return name;}//這裡取出私有屬性name的值 


c#在定義類時,通常要把類中聲明的對象封裝起來,使得外界不能訪問這個屬性。上述代碼中如果去掉set部分,則外界只能讀取name的值,如果去掉get部分,則只能給name賦值。這樣就可以控制外界對私有屬性name的訪問許可權了,這種寫法是C#的一個特性

當然你也可以通過自己創建函數來對name進行取值和賦值,但這樣就顯得比較麻煩了。


屬性與普通變數不同就在於, 普通變數就是放在屋子裡的東西, 是什麼樣明明白白. 而屬性則是在屋子的門口放了個守門人, 你拿東西放東西要經過他.

這個守門人就是屬性訪問器, 拿東西就是 get, 放東西就是 set. 怎麼拿怎麼放是它說了算, 雖然你覺得好像就是直接拿直接放差不多. 
GET SET 就是對外的介面 ,一般在實例中訪問成員數據需要這個成員數據的訪問方式為PUBLIC ,現在C#很高級了,GET 就是獲取,SET 就是設置,但是它提供了跟好的收縮性,對GET 和SET 可以單獨設置訪問許可權 比如你對某個成員數據只能讀取或者只寫,或者只有派生類可以訪問等。。。 相對以前來說,沒有屬性訪問器,需要通過函數來調用私有成員數據,屬性提供了高效的訪問模式和簡單的書寫。 
就是為了安全啊~~ 
欄位是你具體要操作的數據所以他的值不能出錯,可是你又不能避免用戶犯錯~~ 
為了安全就用屬性來給欄位賦值,因為 在set中你可以對數據的安全進行驗證, 
get就更簡單了驗證完數據了就要把值給了欄位所以要get 
set的中文意思是“設置”; 
get的中文意思是“獲得”;

補充:

get 和 set 會在相應的時候自動調用 
主要是為了隱藏程式內的數據結構時用 
get是獲取該屬性的值, 
set設置該屬性的值。 
在用set時有一個特殊的變數value 
就是設置屬性時的值

value 隱式參數,用於設置訪問器以及添加或移除事件處理程式。

對類的屬性進行 設置 
比如用類名.屬性=“”賦值 set作用 
變數=類名.屬性 取值 get 作用


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題描述通過 uint16_t ConvData[8]保存DMA搬運的ADC轉換數值,但是這個數組數值的順序總是和ADC不是順序對應的。比如用7個通道的ADC,當設置ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward,是對 ...
  • 將控制項綁定到多個數據源,ListBox綁定到一個集合,其中每一項綁定到集合中對象的兩個屬性,並對綁定進行了格式化。 ... ...
  • 最近一直在忙工作的事情,所以文章寫得有些少. 有3-5篇文章都是寫到一半然後被別的事情給打斷了,所以,我得找個時間好好補補. 最近一直在關註移動端介面API的可用性問題,在移動時代這個做這個優化能產生相當大的優化結果。根據經驗數據一般不做任何優化,介面的可用性在95%左右。舉個例子,廣告介面的可用性 ...
  • 先看一下 .NET Core(包含 ASP.NET Core)的 "路線圖" : Beta6 : 2015年7月27日 Beta7 : 2015年9月2日 Beta8 : 2015年10月15日 RC1 : 2015年11月 RC2 (Tools Preview 1) : 2016年5月17日 1. ...
  • 有些對象需要顯示地銷毀代碼來釋放資源,比如打開的文件資源,鎖,操作系統句柄和非托管對象。在.NET中,這就是所謂的對象銷毀,它通過IDisposal介面來實現。不再使用的對象所占用的記憶體管理,必須在某個時候回收;這個被稱為無用單元收集的功能由CLR執行。 對象銷毀和垃圾回收的區別在於:對象銷毀通常是 ...
  • .NET常見錯誤大全 1.檢測到有潛在危險的 Request.Form 值 原因: (1)在提交數據的頁面或webconfig中沒有對validateRequest的屬性進行正確的設置 (2)HTML裡面寫了兩個<form>引起 解決: 方案一: 在.aspx文件頭中加入這句: <%@ Page v ...
  • 在資料庫設計時,也許會有一些約定,說一下我自己的三點基本硬性規定: 1、所有欄位都為可空設定(主鍵、布爾類型欄位除外) 2、字元串類型不允許有前後空格(可能特殊情況時除外) 3、如果是空字元串,則應存儲Null(為了防止不同資料庫類型對字元串為空和NULL的不同對待) 第一點是設計時的事情,在這裡可 ...
  • session的使用方法詳解 Session是什麼呢?簡單來說就是伺服器給客戶端的一個編號。當一臺WWW伺服器運行時,可能有若幹個用戶瀏覽正在運正在這台伺服器上的網站。當每個用戶首次與這台WWW伺服器建立連接時,他就與這個伺服器建立了一個Session,同時伺服器會自動為其分配一個SessionID ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...