C#系列 ---2 型別轉換
一定要對比著c++學習!!!
對於第一個作業,建立C#的控制檯應用即可
建立程式後:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
}
}
}
-
C# recognizes a method called Main as signaling the default entry point of execution.
main 函式作為程式執行的入口點。
-
名稱空間 namespace 和 using理解 https://www.w3cschool.cn/csharp/csharp-namespace.html
以此段程式碼為例子講解基本語法:
using System;
class Test
{
static void Main()
{
int x = 12 * 30;
Console.WriteLine (x);
}
}
語法(syntax)
啟發於c和c++,因而比較好理解
-
indentifiers(識別符號) and keywards(關鍵字)
-
識別符號,也可以叫做變數名
比如: System, Test(類名), Main(函式/方法名), x(變數名), Consloe
-
關鍵字: 對編譯器而言,有特殊含義的字母,不允許程式設計師自己定義、修改;程式設計師也不能使用關鍵字作為變數名識別符號
比如: using, void, static, int
保留的關鍵字:
-
-
Literals, Punctuators, and Operators(操作符)
-
Literals:在原始碼中表示值的任何記號,與識別符號 (indentifiers)不同,識別符號要指向記憶體中某一個值
https://stackoverflow.com/questions/485119/what-does-the-word-literal-mean
Examples:
"hey"
(a string)false
(a boolean)3.14
(a real number)[1,2,3]
(a list of numbers)(x) => x*x
(a function)/^1?$|^(11+?)\1+$/
(a regexp)
-
Punctuators : {} ; ()
-
Operators: * / + - = == %
-
-
comment 註釋
單行註釋: //
多行註釋: /**/int x = 3; // Comment about assigning 3 to x int x = 3; /* This is a comment that spans two lines */
4.Type
A type defines the blueprint for a value(
型別決定了該值擁有的方法,屬性)
int x = 12 * 30
比如說, int 型別 決定了 variable(變數)x 擁有int型別的所有屬性和方法。在這裡可以將c#的type簡單的理解為C++的class,而x是int類的物件。注意,int在C#被重寫為類。相似的還有float,string等, 這是C#和C++最大的不同之處
static int FeetToInches(int feet)
{
int inches = feet * 12;
// int 型別的inches可以呼叫ToString方法
Console.WriteLine(inches.ToString());
return inches;
}
variable: 指向的記憶體地址包含的變數是可變的
const: 常量 指向的記憶體地址包含的變數是不可變的
這和C++的概念相同
int x = 12 * 30;
const int y = 360;
-
預定義(內建型別 built-in types)的型別: bool, string, int, float;
在C#中,內建型別為關鍵字(keyword),包含在System 的名稱空間中, 這也就是在程式碼開始部分為什麼使用
using namespace
了 -
使用者自定義型別, 其實就是C++中的自定義類
using System;
//自定義UnitConverter type
public class UnitConverter
{
int ratio; // Field
public UnitConverter (int unitRatio) {ratio = unitRatio; } // Constructor
public int Convert (int unit) {return unit * ratio; } // Method
}
class Test
{
static void Main()
{
// 用自定義的類, 建立物件
UnitConverter feetToInchesConverter = new UnitConverter (12);
UnitConverter milesToFeetConverter = new UnitConverter (5280);
Console.WriteLine (feetToInchesConverter.Convert(30)); // 360
Console.WriteLine (feetToInchesConverter.Convert(100)); // 1200
Console.WriteLine (feetToInchesConverter.Convert(
milesToFeetConverter.Convert(1))); // 63360
}
}
以後要適應type的定義。。。
- type 的成員(members):
- data members:
ratio
- function members:
UnitConverter
(建構函式) 和Convert
- Constructors and instantiation(建構函式和例項化)
- 對於內建型別,簡單的使用 literal就可以建立一個物件了。
string myWord = 'Hello World'
- 對於自定義型別, 需要使用操作符new來建立type的例項物件
UnitConverter feetToInchesConverter = new UnitConverter (12);
- 靜態成員(static members)
呼叫物件不是例項物件(instances) ,而是型別本身。
同樣的,如果只想讓type本身呼叫某一個成員,而不想讓例項物件呼叫,需要在成員前加static關鍵字
public class Panda
{
public string Name; // Instance field
public static int Population; // Static field
public Panda (string n) // Constructor
{
Name = n; // Assign the instance field
Population = Population + 1; // Increment the static Population field
}
}
using System;
class Test
{
static void Main()
{
Panda p1 = new Panda ("Pan Dee");
Panda p2 = new Panda ("Pan Dah");
Console.WriteLine (p1.Name); // Pan Dee
Console.WriteLine (p2.Name); // Pan Dah
Console.WriteLine (Panda.Population); // 2
}
}
以上程式碼中,如果呼叫p1.Population
和Panda.Name
,編譯時都會報錯
- public: 對於type的成員而言,public和c++中完全一樣,例項物件可以直接呼叫
conversions 型別轉換
C#在可相容型別的例項物件之間是可轉換的
分為隱式轉換或顯式轉換(implicit or explicit)。和C++一樣的
int x = 12345; // int is a 32-bit integer
long y = x; // Implicit conversion to 64-bit integer
short z = (short)x; // Explicit conversion to 16-bit integer
在以上兩種情況都滿足的情況下才能完成隱式轉換:
- 編譯器總是能夠保證編譯成功
- 在轉換過程中沒有資訊丟失
否則,只能使用顯式轉換
簡單的說,高精度想低精度轉換,需要顯式轉換,因為轉換過程中會有精度丟失,比如32位int型別轉換為16位的short型別需要丟失掉一半的精度資訊,因而需要顯式轉換;而低精度向高精度轉換,隱式轉換就可以。
其實vs 2017編譯器會自動檢查錯誤的,