1. 程式人生 > >【C#基礎】之訪問修飾符、類與屬性、類與結構的簡單介紹

【C#基礎】之訪問修飾符、類與屬性、類與結構的簡單介紹

在學方法之前先學習類……

介紹類之前先介紹下C#中常用的四個訪問修飾符:

我的疑問:結構與類的區別?結構裡不能定義方法,它們都可以定義多個屬性,什麼時候要用結構?什麼時候要用類?

一、C#中的4個常用訪問修飾符:
public:可以在任何地方被訪問
internal:只能在本專案中被訪問
private:只能在本類中被訪問
protected:只能在本類和子類中被訪問。
在一個類中定義變數或方法時,沒有寫訪問修飾符,那麼預設的修飾符為private。

二、什麼是類?
1)類(Class)實際上是對某種型別的物件定義變數和方法的原型。它表示對現實生活中一類具有共同特徵的事物的抽象,是面向物件程式設計的基礎。類是對某個物件的定義。它包含有關物件動作方式的資訊,包括它的名稱、方法、屬性和事件。實際上它本身並不是物件,因為它不存在於記憶體中。當引用類的程式碼執行時,類的一個新的例項,即物件,就在記憶體中建立了。雖然只有一個類,但能從這個類在記憶體中建立多個相同型別的物件。
2)類與結構的區別:
結構體是一種值型別,而類是引用型別。(值型別、引用型別是根據資料儲存的角度來分的)就是值型別用於儲存資料的值,引用型別用於儲存對實際資料的引用。那麼結構體就是當成值來使用的,類則通過引用來對實際資料操作。第二個問題:兩者裡面是不是都有建構函式?為什麼結構體用得比較少? 建構函式是為了初始化類的欄位而存在的,而結構體並不需要初始化就能使用,因此,結構體中並不存在建構函式。 不能以使用多少來衡量,只是看相應問題使用最適合的方法罷了。結構體的定義是:有些資料既是相互關聯的,又共同描述一個完整事物,如:一個學生的整體資訊,學號、姓名、性別等。而類則使用在需要比較有層次的資料上面。
疑問:1、類與結構的例項比較 ?類與結構的差別 ?如何選擇結構還是類?。。。。

3)類與結構的示例比較:
//結構示例:
public struct Person
{
   string Name;
   int  height;
   int  weight
public bool overWeight()
{
    //implement something
}
}
  //類示例:
   public class TestTime
   {
 int hours;
 int minutes;
 int seconds;
 
public void passtime()
{
  //implementation of behavior
}
   }
 //呼叫過程:
  public class Test
  {
public static ovid Main
{
   Person Myperson=new Person      //宣告結構
   TestTime Mytime=New TestTime    //宣告類
}
}
  從上面的例子中我們可以看到,類的宣告和結構的宣告非常類似,只是限定符後面是 struct 還是 class 的區別,而且使用時,定義新的結構和定義新的類的方法也非常類似。

4)那麼類和結構的具體區別是什麼呢?
  類與結構的區別:
1. 值型別與引用型別結構是值型別:值型別在堆疊上分配地址,所有的基型別都是結構型別,例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以建立更多的值型別類是引用型別:引用型別在堆上分配地址堆疊的執行效率要比堆的執行效率高,可是堆疊的資源有限,不適合處理大的邏輯複雜的物件。所以結構處理作為基型別對待的小物件,而類處理某個商業邏輯因為結構是值型別所以結構之間的賦值可以建立新的結構,而類是引用型別,類之間的賦值只是複製引用注:1.雖然結構與類的型別不一樣,可是他們的基型別都是物件(object),c#中所有型別的基型別都是object 2.雖然結構的初始化也使用了New 操作符可是結構物件依然分配在堆疊上而不是堆上,如果不使用“新建”(new),那麼在初始化所有欄位之前,欄位將保持未賦值狀態,且物件不可用 2.繼承性 結構:不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明確的用sealed宣告,可是結構是隱式的sealed . 類:完全可擴充套件的,除非顯示的宣告sealed 否則類可以繼承其他類和介面,自身也能被繼承 注:雖然結構不能被繼承 可是結構能夠繼承介面,方法和類繼承介面一樣。

例如:結構實現介面
interface Image
{
   void Paint();
}
 
struct Picture :Image
{
    public void Paint()
    {
         //程式碼部分
    }
    private int x, y, z;  // 其它結構成員
}
內部結構:結構:沒有預設的建構函式,但是可以新增建構函式 沒有解構函式 沒有 abstract 和 sealed(因為不能繼承) 不能有protected 修飾符 可以不使用new 初始化在結構中初始化例項欄位是錯誤的類: 有預設的建構函式 有解構函式 可以使用 abstract 和 sealed 有protected 修飾符必須使用new 初始化。
5)如何選擇結構還是類?
   討論了結構與類的相同之處和差別之後,下面討論如何選擇使用結構還是類:1. 堆疊的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些2. 結構表示如點、矩形和顏色這樣的輕量物件,例如,如果宣告一個含有 1000 個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構的成本較低。3. 在表現抽象和多級別的物件層次時,類是最好的選擇4. 大多數情況下該型別只是一些資料時,結構時最佳的選擇。

三、什麼是屬性?

1、欄位用public修飾的問題;2、屬性的定義get和set;3、屬性是為了保護與之相對應的欄位的。保證對欄位的讀取和賦值符合要求。4、屬性可分為:讀寫、只讀、只寫三種,只有get方法的屬性叫只讀屬性,只能讀取不能寫入;5、允許外部訪問的變數一定要宣告為屬性;右擊變數->重構->封裝欄位->確定->應用

類及其屬性例項介紹:

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

namespace 類與屬性
{
    class Program
    {
        static void Main(string[] args)
        {
            //構造方法進行傳參,來對變數進行初始化。
            Student stu = new Student("張三", '男', 20, 85, 82, 92);//例項化時通過構造方法給name賦值
            //stu.Name = "張三";
            //stu.Sex = '男';
            //stu.Age = 21;
            //stu.Chinese = 85.0;
            //stu.Math = 78.5;
            //stu.English = 95.5;

            Student stu2 = new Student("李四", '女', 18);
            //stu2.Name = "李四";
            //stu2.Sex='女';
            //stu2.Age=20;
            stu2.Chinese = 80;
            stu2.Math = 73;
            stu2.English = 98;

            Console.WriteLine("下面是張三打招呼和顯示成績的方法");
            stu.SayHello();
            stu.ShowScore();

            Console.WriteLine("下面是李四打招呼和顯示成績的方法");
            stu2.SayHello();
            stu2.ShowScore();

            Console.ReadKey();
        }
    }
}
再新增一個Student類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 類與屬性
{
    class Student
    {
        //要將引數的name賦給欄位的name
        public Student(string name,char sex,int age,double chinese,double math,double english)
        {
            this.name = name;//可以按F12轉到定義看這區分這兩個name
            this.sex = sex;
            this.age = age;
            this.chinese = chinese;
            this.math = math;
            this.english = english;
        }

        public Student(string name, char sex, int age)
        {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }

        string name;

        public string Name
        {
            get { return name; }//將姓名定義為只讀,不能被賦值
            //set { name = value; }
        }
        char sex;

        public char Sex
        {
            get { return sex; }
            set 
            {
                if (value == '男' || value == '女')
                {
                    sex = value;
                }
                else
                {
                    sex = '男';
                }
            }
        }
        int age;

        public int Age
        {
            get { return age; }
            set
            {
                age = value >= 0 ? value : 0;
            }
        }
        double chinese;

        public double Chinese
        {
            get { return chinese; }
            set
            {
                chinese = value >= 0 ? value : 0;
            }
        }
        double math;

        public double Math
        {
            get { return math; }
            set
            {
                math = value >= 0 ? value : 0;
            }
        }
        double english;

        public double English
        {
            get { return english; }
            set
            {
                english = value >= 0 ? value : 0;
            }
        }

        public void SayHello()
        {
            Console.WriteLine("大家好,我叫{0},我今年{1}歲了,我是{2}同學", name, age, sex);
        }

        public void ShowScore()
        {
            double sum = chinese + math + english;
            double avg = sum / 3;
            Console.WriteLine("我叫{0},我的總分是{1},我的平均分是{2}",name,sum,avg);  
        }
    }
}

簡單介紹了類與屬性,待續……