C#基礎知識(5)
一、列舉
列舉:是一種資料型別,列舉適用於取值範圍有限的資料
語法
[訪問許可權修飾符] 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
}
}