香蕉视频app

Keep on going never give up.

Let's Go

C# 學習筆記(21)類

C#Lonely2019-05-07 07:00:0058次0條

C#是一種面向對象的語言,面向對象語言的一個基本特征就是它們都有類,類是面向對象程序設計中的概念,是面向對象編程的基礎

類的實質是一種數據類型,類似于int、char等基本類型,不同的是類是一種復雜的數據類型香蕉视频app。因為它的本質是類型,而不是數據,所以不存在于內存中,不能被直接操作,只有被實例化為對象時,才會變得可操作。

類是對現實生活中一類具有共同特征的事物的抽象。在現實生活中,人就是一個類,但人只是一個抽象的概念,它指的是所有人。如果我們想找人聊天,此時就需要某個具體的人,比如我就是“人”類的一個實例。人這個類別中的個體,都有一些共同的特性(例如:姓名、性別、年齡等)和行為(例如:吃飯、工作、睡覺、思考等),所以在C#中,類代表一組具有公共屬性和行為的對象

在C#中定義一個類的基本格式如下:

[訪問修飾符] class 類名稱

{

//類成員的定義

}

默認情況下,如果class關鍵字前沒有顯式地指定訪問修飾符,則類的訪問修飾符為internal,表示僅在當前項目內可被訪問。當然也可顯式地使用internal修飾符來定義類,但完全沒有必要,因為默認修飾符就是internal。

C#中的五種訪問修飾符傳送門,可以修飾類的修飾符如下表格所示。

修飾符 訪問權限
無或internal 只能在同一個程序(項目)集中訪問(internal是類的默認訪問修飾符)
public 公開的,同一程序集或引用該程序集的其他程序集都可以訪問
abstract或internal abstract 只能在同一程序集中訪問類,該類不能被實例化,只能被繼承
public abstract 同一程序集或引用該程序集的其他程序集都可以訪問類,不能被實例化,只能被繼承
sealed或internal sealed 只能在同一程序集中訪問類,該類不能被繼承,只能被實例化
public sealed 同一程序集或引用該程序集的其他程序集都可以訪問類,不能被繼承,只能被實例化

可訪問性不一致的問題:子類的訪問權限不能高于父類的訪問權限,因為這樣會暴露父類個成員。


類的成員

定義完類之后,還需要在類中定義成員。類的成員包括字段、屬性、方法、和構造函數等,它們與類一樣,也都有自己的訪問權限。

格式: [成員修飾符] 類的成員字段或者成員函數等;

例字段:protected 數據類型 字段名; //受保護的,只能在當前類的內部以及該類的子(派生)類中訪問。類中的成員默認的訪問修飾符是protected。

香蕉视频app 若使用static關鍵字將其聲明為類的靜態成員,則其不屬于類的實例(類的實例也叫作類的對象),因為靜態成員屬于類級別的概念。

香蕉视频app 使用不同的修飾符將直接導致類的成員具有不同的訪問權限。


屬性

屬性是對字段的擴展,根據面向對象語言的封裝思想,字段的訪問修飾符最好設為private,因為這樣可以防止客戶端直接對字段進行纂改,從而保證了內部成員的完整性。于是為了訪問類中的私有字段,C#提供了屬性這種機制,用來對字段進行靈活的控制和訪問。

香蕉视频app 屬性的作用就是保護字段,可以對字段的賦值和取值進行限定。屬性定義主要由get訪問器和set訪問器組成,get訪問器負責對字段進行讀取,set訪問器負責為字段進行賦值(它通過value隱式參數來表示用戶傳入的值),屬性的本質就是兩個方法,get方法用來返回字段,set方法用來把用戶傳入的值賦值給字段。

普通屬性定義的格式:

public 數據類型 屬性名

{

get { return 字段名; } //get香蕉视频app訪問器,當你輸出屬性的值的時候,會執行get方法

set { 字段名 = value; } //set 訪問器,當你給屬性賦值的時候,首先會執行set方法

}

快速生成普通屬性的方法:鍵入“propfull”連按兩次“Tab”,自動生成后再修改數據類型、屬性名和變量名。

注:屬性的數據類型必須與訪問字段的數據類型一致。

香蕉视频app 代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Person
    {
        private string name; //私有字段定義
        
        //公有屬性定義
        public string Name
        {
            get //get訪問器
            {
                return name;
            }
            set //set訪問器
            {
                name = value; //value是隱式參數
            }
        }
        
    }
}

當然啦,你也可以不使用屬性來表示,替換辦法如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Person
    {
        private string name; //私有字段定義
        
        public string getName() //返回字段
        {
            return name;
        }
        
        public void setName(string value) //為字段賦值
        {
            name = value;
        }
        
    }
}

在不使用屬性的情況下,只能通過定義兩個方法來對字段進行訪問,是不是比較麻煩啊。C#為了使字段的訪問過程更加簡單,提出了屬性的概念,通過操作屬性來訪問字段,避免了調用方法。

上面我們介紹的是可讀可寫屬性可讀可寫屬性同時包含get訪問器和set訪問器),下面介紹一下只讀屬性只寫屬性當屬性僅包含get訪問器,或set訪問器為private級別時,這樣的屬性稱為只讀屬性當屬性僅包含set訪問器,或get訪問器為private級別時,這樣的屬性稱為只寫屬性

香蕉视频app 代碼實例:

private string name; //私有字段定義

//只讀屬性定義方法一:
public string Name
{
    get //get訪問器
    {
        return name;
    }          
}
private string name; //私有字段定義

//只讀屬性定義方法二:
public string Name
{
    get //get訪問器
    {
        return name;
    }
    private set //set訪問器
    {
        name = value; //value是隱式參數
    }
}
private string name; //私有字段定義

//只寫屬性定義方法一:
public string Name
{
    set //set訪問器
    {
        name = value; //value是隱式參數
    }
}
private string name; //私有字段定義

//只寫屬性定義方法二:
public string Name
{
    private get //get訪問器
    {
        return name;
    }
    set //set訪問器
    {
        name = value; //value是隱式參數
    }
}

屬性除了能直接訪問私有字段外,還可以根據需要加入更多的邏輯控制代碼。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Person
    {
        private string _name;       
        private int _age;
        private char _gender;
        
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        
        public int Age
        {
            get { return _age; }
            //在賦值的時候,對字段進行限定,如果用戶輸入的年齡為負數或大于100,則默認賦值為0
            set
            {
                if (value < 0 || value > 100)
                {
                    value = 0;
                }
                _age = value;
            }
        }
        
        public char Gender
        {
            //在訪問取值的時候,對字段進行限定,如果用戶輸入的性別不是男或女,則默認賦值男,再返回
            get
            {
                if (_gender != '男' || _gender != '女')
                {
                    _gender = '男';
                }
                return _gender;
            }
            set { _gender = value; }
        }
               
    }
}

和靜態字段類似,屬性也可以通過static關鍵字聲明為靜態屬性,此時的靜態屬性屬于類級別,不能通過類的實例進行訪問,也不能在靜態屬性中使用非靜態的字段。

香蕉视频app 靜態屬性定義代碼示例:

private static string _name; 
      
public static string Name
{
    get { return _name; }
    set { _name = value; }
}

普通屬性代碼還是很多寫起來還是很麻煩怎么辦?不急還有更簡便的方法,下面來介紹自動屬性,自動屬性是C# 5.0(含)之后,微軟新增的語法糖,全稱為 Auto-Implemented Properties。如果屬性的get和set訪問器中沒有任何邏輯,就可以使用自動實現的屬性。不需要聲明私有化字段。編譯器會自動創建它。

自動屬性格式:

public 數據類型 屬性名 { get; set; } //取值方法和賦值方法可以指定不同的訪問權限

快速生成自動屬性的方法:鍵入“prop”連按兩次“Tab”,自動生成后再修改成需要的數據類型和屬性名。

快速自動生成公開讀,私有寫屬性的方法: 鍵入“propg”連續兩次“Tab”,自動生成后再修改成需要的數據類型和屬性名。

自動屬性和普通屬性的區別:

1、普通屬性有私有字段和方法體。

2、自動屬性不能有方法體,和私有字段。

3、本質上自動屬性和普通屬性沒有區別。

自動屬性代碼示例:

public string Name { get; set; }


類的實例化

當寫好了一個類后,我們需要創建這個類的對象,創建這個類的對象的過程,我們稱之為類的實例化,使用new關鍵字 。實例化就是創建一個對象的過程,對象就是類的實例香蕉视频app。注意:只有包含實例構造函數的類才能被實例化,而在靜態類中是不能定義實例構造函數的。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person(); //創建Person類的對象,創建這個類的對象的過程,就是類是實例化
            //當我們創建好一個類的對象后,需要給這個對象的每個屬性去賦值,這個過程稱之為對象的初始化。
            p.Name = "張三";
            p.Gender = '人';
            p.Age = -360;
            p.Tel = "13888888888";
            p.Print();
            Console.ReadKey();
        }
    }
}

香蕉视频app Person類代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Person
    {
        private string _name;
        private char _gender;
        private int _age;
        
        //使用了普通屬性
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        
        //使用了自動屬性
        public string Tel { get; set; }
        
        public char Gender
        {
            //在訪問取值的時候,對字段進行限定,如果用戶輸入的性別不是男或女,則默認賦值男,再返回
            get
            {
                if (_gender != '男' || _gender != '女')
                {
                    _gender = '男';
                }
                return _gender;
            }
            set { _gender = value; }
        }
        
        public int Age
        {
            get { return _age; }
            //在賦值的時候,對字段進行限定,如果用戶輸入的年齡為負數或大于100,則默認賦值為0
            set
            {
                if (value < 0 || value > 100)
                {
                    value = 0;
                }
                _age = value;
            }
        }
        
        public void Print()
        {
            Console.WriteLine("姓名:{0},性別:{1},年齡:{2},電話:{3}", this.Name, this.Gender, this.Age,this.Tel); //this:表示當前這個類的對象
        }
        
    }
}

運行結果:

image.png




暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!