密封屬性

来源:http://www.cnblogs.com/bb-love-dd/archive/2016/10/29/6011373.html
-Advertisement-
Play Games

網上收集的這些,感覺還不錯 函數等集合在一個個的單元中(我們稱之為類)。被封裝的對象通常被稱為抽象數據類型。在本文中,我們將詳細學習屬性的特性。 封裝的概念 可以把程式按某種規則分成很多“塊“,塊與塊之間可能會有聯繫,每個塊都有一個可變部分和一個穩定的部分。我們需要把可變的部分和穩定的部分分離出來, ...


網上收集的這些,感覺還不錯
函數等集合在一個個的單元中(我們稱之為類)。被封裝的對象通常被稱為抽象數據類型。在本文中,我們將詳細學習屬性的特性。
封裝的概念
可以把程式按某種規則分成很多“塊“,塊與塊之間可能會有聯繫,每個塊都有一個可變部分和一個穩定的部分。我們需要把可變的部分和穩定的部分分離出來,將穩定的部分暴露給其他塊,而將可變的部分隱藏起來,以便於隨時可以讓它修改。這項工作就是封裝.
例如:在用類實現某個邏輯的時候,類就是以上所說的塊,實現功能的具體代碼就是可變的部分,而public的方法或者屬性則是穩定的部分。
封裝的意義

封裝的意義在於保護或者防止代碼(數據)被我們無意中破壞。在面向對象程式設計中數據被看作是一個中心的原素並且和使用它的函數結合的很密切,從而保護它不被其它的函數意外的修改。
封裝提供了一個有效的途徑來保護數據不被意外的破壞。相比我們將數據(用域來實現)在程式中定義為公用的(public)我們將它們(fields)定義為私有的(privat)在很多方面會更好。
私有的數據可以用兩種方式來間接的控制。下麵我們看一些c#例子來學習這兩種方法用以封裝數據。第一種方法,我們使用傳統的存、取方法。第二種方法我們用屬性(property)。無論我們使用哪種的方法,我們的目標是在使用數據的同時不能使它受到任何的破壞和改變。有如下好處

其一: 使用者只需要瞭解如何通過類的介面使用類,而不用關心類的內部數據結構和數據組織方法。
其二:高內聚,低耦合一直是我們所追求的,用好封裝恰恰可以減少耦合
其三:只要對外介面不改變,可以任意修改內部實現,這個可以很好的應對變化
其四:類具有了簡潔清晰的對外介面,降低了使用者的學習過程
用傳統的讀、寫方法封裝

讓我們來看一個例子有一個類Department,為了操縱這個類中的數據(string departname)我們定義了一個讀方法和一個寫方法。
using system;
public class Department
{
private string departname;
.......
// 讀方法
public string GetDepartname()
{
return departname;
}
//寫方法
public void SetDepartname( string a)
{
departname=a;
}
}
通過上面的方法,我們可以保護私有數據不被外部程式所破壞。

常用的是使用這個!!!!
c#使用屬性封裝 
1、使用屬性封裝方法
2、AccessModifer Type PropertyName
{get{...}set{...}
}
public int {get{ return this.X}set{this.x=rangeCheckX(value)}
}
2、屬性對某個欄位封裝時,命名規則,首字母大寫
private int employeeID;public int EmployeeID
{get{return this.EmployeeID;};set{this.EmployeeID=value}
}
3、介面中定義屬性
interface IScreenPosition
{
int X{get;set;}
int Y{get;set;}
}


4、實例化同時賦值
static void DoWork()
        {
            Polygon square = new Polygon();
            Polygon triangle = new Polygon { NumSides = 3 };
            Polygon pentagon = new Polygon { SideLength = 15.5, NumSides = 5 };

            Console.WriteLine("Square: number of sides is {0}, length of each side is {1}", 
                square.NumSides, square.SideLength);
            Console.WriteLine("Triangle: number of sides is {0}, length of each side is {1}", 
                triangle.NumSides, triangle.SideLength);
            Console.WriteLine("Pentagon: number of sides is {0}, length of each side is {1}", 
                pentagon.NumSides, pentagon.SideLength);
        }



詳細請看它::::
c#中的屬性 

   在C#中我們可以很自由的訪問共有欄位,但有時我們可能需要某欄位只能讀或者寫,或在改變欄位值得時候做一些其他事情,顯然這些僅僅依靠欄位是無法實現的,於是便有了屬性。 
   1、基本用法
   c#中的屬性由屬性作用域中定義的get作用域(訪問方法)和set作用域(訪問方法)構成。
class Test
{
private int number;

    //int表示該屬性所封裝的數據類型
    //數據類型必須與相應的欄位(number)相同   
    public int Num
    {
        get{return number;}
        set{number=value;}
    }
}

   當封裝數據時,可能希望配置一個只讀屬性。為此,可以忽略set塊。類似,如果想擁有一個只讀屬性,就忽略get塊。 
   2、靜態屬性  
   C#靜態屬性可以是讀寫屬性,只讀屬性,只寫屬性中的任意一種。靜態訪問器適用於整個類,而不是類的實例。靜態屬性中的set,get訪問器只能訪問類的靜態成員。靜態屬性可以通過類名訪問,不能使用實例調用,這與靜態方法相同。
//簡單的儲蓄賬戶類
class SavingAccount
{
//實例級別的數據
public double currBalance;

   //靜態數據點 
   private static double currInterestRate = 0.04; 

   //靜態屬性
   public static double InterestRate
   {
     get{return currInterestRate;}
     set{currInterestRate=value;}
   }                    
 }

 
   3、自動屬性
   自動屬性可以簡化封裝數據欄位的過程,減輕了定義私有返回欄位和相關c#屬性成員的工作。在定義自動屬性時,只指定訪問修飾符、實際的數據類型、屬性名稱和空的get/set作用域。在編譯時,編譯器為類型自動生成了私有返回欄位和適當的get/set實現邏輯。
class Enemy
{
//自動屬性
public string Name{get;set;}
public int Life{get;set;}
public float Attack{get;set;}

 }

   註意:與傳統的屬性不同的是,不允許構建只讀或只寫的自動屬性,自動屬性定義是必須同時支持讀寫功能。但是定義更嚴格的get或set是可以的
 
   4、關於自動屬性和預設值
   可以直接在代碼中使用封裝了數字或布爾數據的自動屬性,因為隱藏的返回欄位將設置一個可以直接使用的安全的預設值。但如果自動屬性封裝了另一個類變數,隱藏的私有引用類型的預設值將設為null。
   例如下麵的類spawn,使用了兩個自動屬性
class Spawn
{
//隱藏的int欄位預設值為0
public int numbers{get;set;}
//隱藏的Enemy返回欄位為null
public Enemy MyEnemy{get;set;}
}
   當直接調用MyEnemy時,將會在運行時得到空引用異常,因為沒有為後臺使用的Enemy成員變數設置新的對象。
   由於私有的返回欄位是在編譯時創建的,所以不能直接使用new關鍵字直接分配引用類型,必須在類的構造函數內部執行,以確保對象以安全方式誕生。
class Spawn
{
//隱藏的int欄位預設值為0
public int numbers{get;set;}
//隱藏的Enemy返回欄位為null
public Enemy MyEnemy{get;set;}

      //必須用構造函數重寫分配給隱藏返回欄位的預設值 
      public Spawn()
      {
         MyEnemy = new Enemy();
         numbers = 1;
      }
  
      public Spawn(Enemy enemy, int num)
      {
         MyEnemy = enemy;
         numbers = num;
      }
 }

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

-Advertisement-
Play Games
更多相關文章
  • 我們在使用 "$top" 的時候有一列NI參數,這個參數就是進程的nice值,用來表示進程在系統調度中的優先順序,Linux中的進程nice從 20到+19,越小表明調度的優先順序越高,用戶進程的最小nice值就是0,比這個還要小的都是系統進程,非管理員不允許指定小於0的進程 `$nice n [新的n ...
  • 相關結構 相關函數 主調用 如果函數調用失敗,都返回 1,調用失敗會在全局變數error里有相應的值 不涉及到讀取、發送的時候,調用正常都返回0 socket() 創建套接字 family: 協議或地址族,TCP/IP為PF_INET,(ipv6為PF_INET6),也可以使用AF_INET typ ...
  • 最近剛換了新的筆記本電腦,終於使用上intel i7處理器,可以使用硬體虛擬化技術安裝系統。配置如下: 主機 ThinkPad P50s OS Window 10 虛擬機軟體 Oracle VirtualBox (個人感覺速度很快,並且可以創建相容 VMWare 和Hyper-V的虛擬機文件格式) ...
  • Hello World! ——《新手指南之玩轉實驗樓》第1節 實驗介紹 本節主要介紹電腦相關技術的基本概念,面向完全沒有編程經驗的朋友. 電腦體系 電腦系統 人機交互 編程語言種類 我的操作 1.電腦相關技術基本概念介摘錄 電腦體系: 電腦是一個很龐大的體系,主要領域可以包括:電腦系統 ...
  • [TOC] mdev說明 mdev是busybox自帶的一個簡化版的udev,適合嵌入式應用場合。其具有使用簡單的特點。它的作用就是在 系統啟動 和 熱插拔 或 動態載入驅動程式 時,自動產生驅動程式所需要的節點文件。在以busybox為基礎構建嵌入式linux根文件系統時,使用它時最優的選擇。 m ...
  • ...
  • 創建鏡像 創建鏡像的方法有三種: 基於已有的容器創建 基於本地模板導入 基於dockerfile 基於已有的容器創建 主要使用docker commit 命令,命令格式: docker commit [OPTIONS] CONTAINER [REPOSITORY[:tag]],主要包括: -a ,- ...
  • 為了加快系統運行效率,一般情況下系統會採用緩存技術,將常用信息存放到緩存中,避免頻繁的從資料庫、文件中讀寫,造成系統瓶頸,從而提高響應速度。緩存分為客戶端緩存和伺服器端緩存。 目前隨著系統的擴展,伺服器端緩存一般採取兩級緩存技術,本地緩存和分散式緩存。部分常用、公共或者小數據量的信息保存在分散式緩存 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...