C# 操作符
- 一、操作符概覽
- 二、優先級與運算順序
- 三、各類操作符的實例
一、操作符概覽
-
操作符(運算符)的本質是函數的簡記法
-
操作符不能脫離與它關聯的數據類型
int x = 5; int y = 4; int z = x / y; Console.WriteLine(z);//輸出1double a = 5.0; double b = 4.0; double c = a / b; Console.WriteLine(c);//輸出1.25
二、優先級與運算順序
-
按表格順序從上到下優先級依次降低
-
同優先級操作符從左到右
-
賦值操作符從右到左
int x = 100; int y = 200; int z = 300; x += y += z; Console.WriteLine(x);//600 Console.WriteLine(y);//500 Console.WriteLine(z);//300
三、各類操作符的實例
x.y
成員訪問操作符
-
訪問外層名稱空間的子集名稱空間
-
訪問名稱空間的類型
-
訪問類型的靜態成員
System.IO.File.Create("D:\\HelloWorld");
System.IO
:外層名稱空間的子集名稱空間IO.File
:名稱空間的類型File.Create
:類型的靜態成員
-
訪問對象的成員
Form myForm = new Form(); myForm.Text = "Hello, World!"; myForm.ShowDialog();
-
f(x)
方法調用操作符 -
a[x]
元素訪問操作符//訪問數組 int[] myArray1 = new int[10]; int[] myArray2 = new int[] { 1,2,3,4,5}; int[] myArray3 = new int[5] { 1, 2, 3, 4, 5 }; Console.WriteLine(myArray2[0]);//訪問字典 class Program {static void Main(string[] args){Dictionary<string, Student> stuDic = new Dictionary<string, Student>();for (int i = 0; i < 100; i++){Student student = new Student();student.Name = "s_" + i.ToString();student.Score = i;stuDic.Add(student.Name, student);}Student number6 = stuDic["s_6"];Console.WriteLine(number6.Score);//6}}class Student {public string Name;public int Score; }
-
x++
后置自增 ,x--
后置自減 。遇到賦值,先賦值,后自增/自減int x = 100;int y = x++;Console.WriteLine(x);//101Console.WriteLine(y);//100
-
new
:在內存中創造一個類的實例,(1)立即調用這個實例的構造器,(2)調用實例的初始化器Form myForm1 = new Form();Form myForm2 = new Form() { Text = "Hello" };
//匿名類型var person = new { Name = "Mr.Ok", Age = 34 };Console.WriteLine(person.Name);//Mr.OkConsole.WriteLine(person.Age);//34
-
typeof
操作符:查看一個類型的內部結構Type t = typeof(int);Console.WriteLine(t.Namespace);//SystemConsole.WriteLine(t.FullName);//System.Int32Console.WriteLine(t.Name);//Int32int c = t.GetMethods().Length;foreach (var mi in t.GetMethods()){Console.WriteLine(mi.Name);//CompareTo、 Equals、GetHashCode ......}Console.WriteLine(c);//53
-
default
:獲取一個類型的默認值//結構體類型int x = default(int);Console.WriteLine(x);//0
//引用類型Form myForm = default(Form);Console.WriteLine(myForm == null);//true
class Program {static void Main(string[] args){//枚舉類型Level1 level1 = default(Level1);Console.WriteLine(level1); //LowLevel2 level2 = default(Level2);Console.WriteLine(level2); //MediumLevel3 level3 = default(Level3);Console.WriteLine(level3); //邏輯出錯,輸出0}} enum Level1 {Low,Medium,High} enum Level2 {Low = 1,Medium = 0,High = 2}enum Level3 {Low = 2,Medium = 1,High = 3}
-
checked
/unchecked
:檢查一個值是否有溢出//第一種用法uint x = uint.MaxValue;uint y = x+1;Console.WriteLine(x);//4294967295Console.WriteLine(y);//0try{uint z = checked(x + 1);Console.WriteLine(z);}catch (OverflowException ex){Console.WriteLine("There's overflow");//There's overflow}
//第二種用法uint x = uint.MaxValue;uint y = x + 1;Console.WriteLine(x);//4294967295Console.WriteLine(y);//0checked{try{uint z = x + 1;Console.WriteLine(z);}catch (OverflowException ex){Console.WriteLine("There's overflow");//There's overflow}}
-
sizeof
: 獲取基本類型在內存中占的字節數int x = sizeof(int);Console.WriteLine(x);//4
class Program {static void Main(string[] args){unsafe {int y = sizeof(Student);Console.WriteLine(y);}} }class Student {int ID;long Score; }
-
->
:箭頭操作符。會直接操作內存,因此需要放在不安全的上下文使用。只能操作結構體類型。class Program {static void Main(string[] args){unsafe{Student stu;stu.ID = 1;stu.Score = 60;Student* pStu = &stu;pStu->Score = 90;Console.WriteLine(stu.Score);//90}} }struct Student {public int ID;public long Score; }
-
*x
class Program {static void Main(string[] args){unsafe{Student stu;stu.ID = 1;stu.Score = 60;Student* pStu = &stu;pStu->Score = 90;(*pStu).Score = 1000;Console.WriteLine(stu.Score);//100}} }struct Student {public int ID;public long Score; }
-
-x
:相反數操作符,在二進制的基礎上,按位取反,再加1int x = int.MinValue;int y = -x;Console.WriteLine(x)//-2147483648Console.WriteLine(y);//-2147483648string xStr = Convert.ToString(x,2).PadLeft(32,'0');//10000000000000000000000000000000string yStr = Convert.ToString(y, 2).PadLeft(32, '0');//10000000000000000000000000000000Console.WriteLine(xStr);Console.WriteLine(yStr);
-
(T)x
:強制類型轉換操作符- 隱式類型轉換
-
不丟失精度的轉換
//短整型轉換成長整型 int x = int.MaxValue; long y = x; Console.WriteLine(y);
源 目標 sbyte short、int、long、float、double 或 decimal byte short、ushort、int、uint、long、ulong、float、double 或 decimal short int、long、float、double 或 decimal ushort int、uint、long、ulong、float、double 或 decimal int long、float、double 或 decimal uint long、ulong、float、double 或 decimal long float、double 或 decimal char ushort、int、uint、long、ulong、float、double 或 decimal float double ulong float、double 或 decimal -
子類向父類的轉換
-
裝箱
-
- 顯式類型轉換
-
有可能丟失精度(甚至發生錯誤)的轉換,即cast
int x = 100; short y = (short)x; Console.WriteLine(y);
源 目標 sbyte byte、ushort、uint、ulong 或 char byte Sbyte 或 char short sbyte、byte、ushort、uint、ulong 或 char ushort sbyte、byte、short 或 char int sbyte、byte、short、ushort、uint、ulong 或 char uint sbyte、byte、short、ushort、int 或 char long sbyte、byte、short、ushort、int、uint、ulong 或 char ulong sbyte、byte、short、ushort、int、uint、long 或 char char sbyte、byte 或 short float sbyte、byte、short、ushort、int、uint、long、ulong、char 或 decimal double sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 decimal decimal sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 double -
拆箱
-
使用Convert類
-
ToString方法與各數據類型的Parse/TryParse方法
-
- 自定義類型轉換操作符
class Program {static void Main(string[] args){Stone stone = new Stone();stone.Age = 5000;Monkey wukong = (Monkey)stone;Console.WriteLine(wukong.Age);//10} }class Stone {public int Age;public static explicit operator Monkey(Stone stone){Monkey m = new Monkey();m.Age = stone.Age / 500;return m;} } class Monkey {public int Age; }
- 隱式類型轉換
-
/
:除法操作符
int x1 = 5;int y1 = 4;Console.WriteLine(x1 / y1);//1double x2 = 5.0;double y2 = 4.0;Console.WriteLine(x2 / y2);//1.25
//被除數為0int x1 = 5;int y1 = 0;Console.WriteLine(x1 / y1);//報錯double x2 = 5.0;double y2 = 0;Console.WriteLine(x2 / y2);//∞
is
:檢驗一個對象是不是某個類型的對象
class Program{static void Main(string[] args){Teacher t1 = new Teacher();Teacher t2 = null;var result1 = t1 is Teacher;var result2 = t1 is Hunam;var result3 = t2 is Teacher;Console.WriteLine(result1);//TrueConsole.WriteLine(result2);//TrueConsole.WriteLine(result3);//False}}class Animal {public void Eat() {Console.WriteLine("Eating...");}}class Hunam:Animal{public void Think(){Console.WriteLine("Thinking...");}}class Teacher : Hunam{public void Teach(){Console.WriteLine("Teaching...");}}
as
object obj = new Teacher();Teacher t = obj as Teacher;if (t != null){t.Teach();//Teaching...}
&&
和||
,注意短路效應
int x = 3;int y = 4;int a = 3;if (x > y && a++ > 3){Console.WriteLine("Hello");}Console.WriteLine(a);//3
int x = 5;int y = 4;int a = 3;if (x > y && a++ > 3){Console.WriteLine("Hello");}Console.WriteLine(a);//4
int x = 5;int y = 4;int a = 3;if (x > y || a++ > 3){Console.WriteLine("Hello");//Hello}Console.WriteLine(a);//3
int x = 3;int y = 4;int a = 3;if (x > y || ++a > 3){Console.WriteLine("Hello");//Hello}Console.WriteLine(a);//4