1. 程式人生 > 其它 >C#基礎知識(5)

C#基礎知識(5)

技術標籤:c#c#面向物件程式設計

一、列舉

列舉:是一種資料型別,列舉適用於取值範圍有限的資料

語法

[訪問許可權修飾符]	enum	列舉名
{
列舉值
}

列舉的訪問許可權修飾符與類一致,修飾符可寫可不寫。類的預設值為interal,列舉的預設值也是interal。

列舉名遵循大駝峰命名法。

列舉一般和switch-case結合使用。eg:

public enum Season
{
    spring, //0
    summer, //1
    autumn, //2
    winter  //3
}

class Program
{
    public static void Main
(string[] args) { Season s = Season.spring; switch(s){ case Season.spring: Console.WriteLine("春困"); break; case Season.summer: Console.WriteLine("夏打盹"); break; case
Season.autumn: Console.WriteLine("秋乏"); break; case Season.winter: Console.WriteLine("冬眠"); break; } } }

注意事項

1.雖然列舉中的元素的值可以相同,但是強烈不推薦這樣使用。

2.列舉元素預設的值型別是int型,可以修改為其他的整型。

//列舉
//列舉中使用冒號表示這個列舉中元素的資料型別為冒號後的型別(且只能為整型)
public enum Season:long { spring, //0 summer, //1 autumn, //2 winter //3 /* //如果給第一個值賦初值 spring = 3, //3 summer, //4 autumn, //5 winter //6 //如果給第一個值賦初值 spring = 3, //3 summer, //4 autumn = 3, //3 winter //4 //如果此時輸出結果,則結果為:spring(值相等時,順位向下取第一個) //Console.WriteLine(s);//結果為:spring //Console.WriteLine((int)s);//結果為:3 */ } class Program { public static void Main(string[] args) { //如何使用一個列舉(列舉的預設值型別為整型的) //宣告一個列舉型別的變數 Season s = Season.spring;//列舉作為資料型別,可以給變數賦值,但值只能是在枚舉出的元素中。 Console.WriteLine(s);//結果為:spring Console.WriteLine(s + 1);//結果為:summer Console.WriteLine(s + 4);//結果為:4 } }

二、結構體

語法:結構體和類基本上是一樣的

[訪問許可權修飾符] struct 結構體名字{
	
}

結構體與類的相同點

1.都包含欄位,屬性和方法。訪問許可權都一樣。

2.都是通過關鍵字new例項化物件的

結構體與類的不同點

1.結構體物件在棧上開闢的空間,因此結構體是值型別,不是引用型別;而類物件在堆上開闢空間,因此類是引用型別

2.構造方法:

​ a.結構體中不允許寫無參構造。

​ b.而在結構體的有參構造中,必須要給所有的欄位進行賦值

​ c.結構體中始終包含一個public許可權的無參的構造方法。

3.結構體中不允許寫析構方法,只有類才可以。

4.結構體只有一個父類叫做Object,不能被其他的結構體或者類繼承,也不能繼承自其他的結構體或者類

//寫一個結構體
public struct Point
{
    //欄位
    //所有的基本資料型別都是結構體,所以都是值型別的
    public double x;
    public double y;
    public static int a;//與類相同也可定義靜態欄位

    //屬性
    public double X{
        set {this.x = value;}
        get {return x;}
    }

    //有參構造
    public Point(double x,double y) {
        this.x = x;
        this.y = y;
    }

    //靜態構造(和在類中觸發靜態構造的時機一致)
     static Point() { }
    //方法
    public void Test() { }

    
}

public class Program
{
    public static void Main(string[] args)
    {
        //例項化一個Point物件
        Point p = new Point();
        p.x = 10;
        p.y = 20;

        Change(p);
        Console.WriteLine(p.x);//結果為:10
        Console.WriteLine(p.y);//結果為:20
    }

    public static void Change(Point p)
    {
        p.x = 100;
        p.y = 200;
    }
}

三、靜態類

由static修飾的類就是靜態類

特點

​ 1.靜態類不能例項化物件

​ 2.靜態類中不允許寫非靜態的成員

​ 3.靜態類只能由一個父類,叫Object

用途:用來設計工具類

//靜態類
public static class Arrays {
    static Arrays() { }
}
class Program
{
    public static void Main(string[] args)
    {

    }
}

四、Sealed(密封)關鍵字

1.用來修飾類,叫做密封類,被sealed修飾的類不能被繼承

//密封類
sealed class Animal
{

}
//Aniaml類被密封,Dog類不能繼承
class Dog : Animal
{

}

2.用來修飾方法,叫做密封方法,被sealed修飾的方法不能被繼續重寫,且只有override方法可以被密封

class Man : User
{
    public override sealed void Show()
    {
       
    }
}
class SuperMan : Man
{
    public override void Show()
    {
        
    }
}

五、名稱空間

名稱空間是一個虛擬的集合。名稱空間中的元素只能是類、結構體、列舉、介面等型別。

作用

名稱空間可以防止類名的重複,以及更好的管理類

注意事項

1.例項化一個物件

using Space0;//表示引用Space0的名稱空間

namespace Space0
{
    class A { }
}

namespace Space1
{
    class A { }
    class B { }
    class Program
    {
        public static void Main(string[] args)
        {
            //例項化一個A物件
            //預設使用當前名稱空間中的A類
            A a = new A();
            //如果想要使用Space0這個名稱空間中的A類,需要這麼這麼做
            Space0.A aa = new Space0.A();
            //sysytem.Int32[]:陣列在列印時得到的結果,其中system就是名稱空間
        }
    }
}

2.名稱空間可以重複

using Space0;//表示引用Space0的名稱空間
using System;

namespace Space0
{
    class A { }
}

//名稱空間的名稱是允許重複的
//如果用多個名稱空間的名字是一樣的,那麼他們是一個名稱空間
namespace Space0
{
	class A { }//報錯的原因是上面已經有了Space0名稱空間,兩個空間相同 
}

3.名稱空間可以互相巢狀

using Space2;//表示引用Space2的名稱空間
using Space2.Space2;//表示引用Space.Space2的名稱空間
using System;

//名稱空間可以巢狀名稱空間
namespace Space2
{
    class A { }
    //這個名稱空間的名字叫做Space2.Space2
    namespace Space2
    {
        class AA { }
        namespace Space2
        {
            class AAA { }
        }
    }
}

namespace Space1
{
    class Program
    {
        public static void Main(string[] args)
        {   
            A a = new A();//因為using Space2已經呼叫了該名稱空間,因此不用寫Space2.A a = new Space.A()
            AA aa = new AA();//與A同理
            AAA aaa = new AAA();//這個是不能用的,因為名稱空間沒有被引用,相互巢狀的名稱空間之間是不一樣的
        }
    }
}

六、運算子過載

使用關鍵字(operator)進行運算子過載。通過特定的語法,使某些運算子可以具備特殊的功能。

可以過載的運算子

√ 算術運算子(練習:過載++運算子,觀察放在變數前後有沒有區別)

× 賦值運算子不能被過載

√ 關係運算符:如果想重寫關係運算符,那麼必須成對過載(如果過載>,必須過載<=;如果過載>,必須過載<=;如果過載==,必須過載!=;)

√ 邏輯運算子中 & | ! ^可以被過載。× 邏輯運算子中&& ||不能被過載

√ 位運算子中 & | ! ^ ~ 可以被過載

注意事項

1.引數的數量一定要和運算子能夠操作的數量進行匹配

2.引數型別和返回值型別可以隨意設定,但要合情合理

public struct Point
{
    public double x;
    public double y;

    public Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    //運算子過載(poerator),使+加號具有新的功能
    //可以實現兩個Point物件直接相加,得到一個新的點
    //規定必須寫public和static
    public static Point operator + (Point p1, Point p2){
        return new Point(p1.x + p2.x, p1.y + p2.y);        
    }

    //
    public static Point operator -(Point p1){//不需要輸入兩個引數是因為減號不僅可以做減法,還有一層含義是取負數
        return new Point(1, 1);
    }
    public static Point operator *(Point p1, Point P2) {//*需要輸入兩個引數
        return new Point(1, 1);
    }

    public static Point operator +(Point p1, int a)
    {
        return new Point(p1.x + a, p1.y + a);
    }

    public static double operator & (Point p1,int a)
    {
        return p1.x + a; 
    } 
}
public class Program
{
    public static void Main (string[] args)
    {
        Point p1 = new Point(1, 2);
        Point p2 = new Point(2, 3);

        Point p = p1 + p2;
        Console.WriteLine(p.x);//結果為:3
        Console.WriteLine(p.y);//結果為:5

        Point p3 = p1 + 3;
        //Point p4 = 3 + p1;//報錯:呼叫方法時,引數的順序不相同
        Console.WriteLine(p3.x);//結果為:4
        Console.WriteLine(p3.y);//結果為:5

    }
}