1. 程式人生 > >七、C#入門基礎07(屬性和方法,結構和類、建構函式)

七、C#入門基礎07(屬性和方法,結構和類、建構函式)

一、類

定義一個類時,等於定義了一個數據型別的藍圖。
這實際上並沒有定義任何的資料,但它定義了類的名稱意味著什麼,也就是說,類的物件由什麼組成及在這個物件上可執行什麼操作。
物件是類的例項。構成類的方法和變數成為類的成員。

類的定義:
類的定義是以關鍵字 class 開始,後跟類的名稱。
類的主體,包含在一對花括號內。

類定義的一般形式:
class class_name
{
// member variables
variable1;

variableN;
// member methods
method1(parameter_list)
{
// method body
}
}

訪問識別符號 指定了對類及其成員的訪問規則。如果沒有指定,則使用預設的訪問識別符號。類的預設訪問識別符號是 internal,成員的預設訪問識別符號是 private。
資料型別 指定了變數的型別,返回型別 指定了返回的方法返回的資料型別。

二、屬性

屬性是類,結構和介面的命名成員。
類或結構中的成員變數或方法稱為域。
屬性是域的擴充套件,且可使用相同的語法來訪問。
它們使用訪問器讓私有域的值可被讀寫或操作。
屬性不會確定儲存位置。
相反,它們具有可讀寫或計算它們值的訪問器。

訪問器
屬性的訪問器包含有助於讀取或計算或設定屬性的可執行語句。
訪問器宣告可包含get訪問器,set訪問器。

三、方法

方法是把一些相關的語句組織在一起,用來執行一個任務的語句塊。

定義方法:
當定義一個方法時,從根本上說是在宣告它的結構的元素。
(Parameter List)
{
Method Body
}
Access Specifier:訪問修飾符,這個決定了變數或方法對於另一個類的可見性。
Return type:返回型別,一個方法可以返回一個值。返回型別是方法返回的值的資料型別。如果方法不返回任何值,則返回型別為 void。
Method name:方法名稱,是一個唯一的識別符號,且是大小寫敏感的。它不能與類中宣告的其他識別符號相同。
Parameter list:引數列表,使用圓括號括起來,該引數是用來傳遞和接收方法的資料。引數列表是指方法的引數型別、順序和數量。引數是可選的,也就是說,一個方法可能不包含引數。
Method body:方法主體,包含了完成任務所需的指令集。

呼叫方法:
類內部可以使用方法名呼叫方法,類外部必須使用類的例項化物件名.方法名進行呼叫。

四、建構函式

類的建構函式是類的一個特殊的成員函式,當建立類的新物件時執行。
建構函式的名稱與類的名稱完全相同,它沒有任何返回型別。
預設的建構函式沒有任何引數。
但是如果你需要一個帶有引數的建構函式可以有引數,這種建構函式叫做引數化建構函式。
帶有引數的建構函式可以在建立物件的同時給物件賦初始值。

建構函式的定義:
//不帶引數的構造方法
public 類名()
{
//執行程式碼
}
//帶引數的構造方法
public 類名(資料型別 引數1,資料型別 引數2,資料型別 引數3,……,資料型別 引數N)
{
//執行程式碼
}

解構函式:
類的解構函式是類的一個特殊的成員函式,當類的物件超出範圍時執行。
解構函式的名稱是在類的名稱前加上一個波浪形(~)作為字首,它不返回值,也不帶任何引數。
解構函式用於在結束程式(比如關閉檔案、釋放記憶體等)之前釋放資源。
解構函式不能繼承或過載。

解構函式的定義:
~類名()
{
//執行程式碼
}

五、結構

結構體是值型別資料結構。
它使得一個單一變數可以儲存各種資料型別的相關資料。
struct 關鍵字用於建立結構體。

定義結構:
為了定義一個結構,必須使用 struct 語句。
struct 結構名
{
屬性;
};

使用結構:
結構名 結構變數名;
結構變數名.屬性=屬性值;

結構有以下特點:
1.結構可帶有方法、欄位、索引、屬性、運算子方法和事件。
2.結構可定義建構函式,但不能定義解構函式。
但是能為結構定義預設的建構函式。
3.預設的建構函式是自動定義的,且不能被改變。與類不同,結 構不能繼承其他的結構或類。
4.結構不能作為其他結構或類的基礎結構。
5.結構可實現一個或多個介面。
6.結構成員不能指定為 abstract(抽象的)、virtual(虛擬的) 或 protected(受保護的)。
7.使用 New 操作符建立一個結構物件時,會呼叫適當的構造函 數來建立結構。與類不同,結構可以不使用 New 操作符即 可被例項化。不使用 New 操作符,只有在所有的欄位都被 初始化之後,欄位才被賦值,物件才被使用。

類和結構有以下幾個基本的不同點:
1.類是引用型別,結構是值型別。
2.結構不支援繼承。
3.結構不能宣告預設的建構函式。

六,程式碼:

1.Person類(關鍵字:class):

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

namespace _07
{
    /// <summary>
    /// 人的類
    /// </summary>
    public class Person
    {
       //定義屬性  屬性之前會有資料型別 由於資料型別 所以每一個屬性都會有預設值
       //string ""  int 0  char ''
       //面試題:string str=""; string str1=string.Empty; string str2=null; 之間的區別?
       //str 記憶體中需要分配一個空的空間 str1在記憶體中不需要分配記憶體空間

        /// <summary>
        /// 年齡
        /// </summary>
        //屬性預設值  如果屬性不進行賦值 則使用預設值 如果屬性進行賦值 則使用賦值的資訊
        public int age=20;
        /// <summary>
        /// 姓名
        /// </summary>
        public string name;
        /// <summary>
        /// 地址
        /// </summary>
        public string address;

        public char sex;

        //方法
        //方法的過載:同名不同參,與返回值無關(型別“Person”已定義了一個名為“ShowTime”的具有相同引數型別的成員)
        //1 無參無返回 2無參有返回 3有參有返回 4有參無返回

        //1 無參無返回
        /// <summary>
        /// 
        /// </summary>
        public void ShowTime() {
            Console.WriteLine(this.name+"..."+this.age+"..."+this.address+"..."+this.sex);
            Console.ReadKey();
        }

        //2無參有返回
        /// <summary>
        /// 獲取到年齡的預設值
        /// </summary>
        /// <returns>返回一個預設值是10</returns>
        public int GetAge() {
            return 10;
        }

        //3有參有返回
        /// <summary>
        /// 判斷當前輸入的年齡是否符合年齡的規則
        /// </summary>
        /// <param name="age">輸入的年齡</param>
        /// <returns></returns>
        public int GetAge(int age) {
            //如果你的年齡的範圍是在 0到100 則返回你當前輸入的年齡
            if (age>0&&age<100)
            {
                return age;
            }
            //輸入的年齡超過0-100 所以預設返回18
            return 18;

        }

        //4有參無返回 
        /// <summary>
        /// 輸出當前的物件的資訊
        /// </summary>
        /// <param name="p">需要輸出資訊的物件</param>
        public void ShowTime(Person p) {
            Console.WriteLine("姓名:{0},年齡:{1},地址:{2}",p.name,p.age,p.address);
            Console.ReadKey();
        }

        //建構函式 分為2個  無參建構函式(預設的建構函式) 有參建構函式
        //如果寫了  有參建構函式 而不寫無參建構函式 則當前的類裡面只會有有參建構函式
        //所以我們在寫建構函式的時候,有參建構函式和無參建構函式 都需要進行編寫

        // 1建構函式是公共的  2建構函式的名稱和類名一致 3建構函式是沒有返回與不返回之說的

        /// <summary>
        /// 無參的建構函式
        /// </summary>
        public Person() {
            Console.WriteLine("這是一個無參的建構函式");
            Console.ReadKey();
        }

        /// <summary>
        /// 有參的建構函式
        /// </summary>
        /// <param name="age">年齡</param>
        /// <param name="name">姓名</param>
        /// <param name="address">地址</param>
        public Person(int age,string name,string address) {
            Console.WriteLine("這是一個有參的建構函式");
            //this 指的是當前的類
            this.age = age;
            this.name = name;
            this.address = address;
            Console.ReadKey();
        }

        //建構函式有沒有過載的可能性
        //建構函式的過載
        public Person(string name,string address) {
            this.name = name;
            this.address = address;
        }

        public Person(string address) {
            this.address = address;
        }

        ~Person()
        {
            Console.WriteLine("我是解構函式,等於當前的物件使用完畢,並被回收(GC)垃圾回收機制");
            Console.ReadKey();
        }





    }
}

2.Student結構(關鍵字:struct ):

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

namespace _07
{
    /// <summary>
    /// 定義一個學生的結構
    /// </summary>
    public struct Student
    {
        public string Sname;
        public int Sage;

        public void ShowTime() {
            Console.WriteLine(this.Sname+"..."+this.Sage);
            Console.ReadKey();
        }


    }
}

3.測試類 Program

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

namespace _07
{
    class Program
    {
        static void Main(string[] args)
        {
            //如何來使用類
            //1. 類實際上就是物件的共同描述體
            //2. 物件=萬事萬物皆為物件
            //3. 物件有一個關鍵字 new
            //Person p1 = new Person();
            //p1.age = p1.GetAge(120);
            //p1.name = "zs";
            //p1.address = "火星";
            //p1.ShowTime();
            //p1.ShowTime(p1);
            //p1 實際上指的是 年齡是18歲 名字叫做zs 地址在火星的一個人
            //輸出物件的資訊
            //Console.WriteLine("姓名:{0},年齡:{1},地址:{2}",p1.name,p1.age,p1.address);

            Person p1 = new Person(18,"zs","火星");
            p1.ShowTime();
            Person p2 = new Person("ls", "地球");
            p2.ShowTime();
            Person p3 = new Person( "水星");
            p3.ShowTime();

            //Student stu = new Student();//可以new 一般不new
            Student stu;
            stu.Sname = "zs";
            stu.Sage = 18;
            stu.ShowTime();


        }
    }
}