1. 程式人生 > >C#系列 ---2 型別轉換

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)
        {
        
        }
    }
}
  1. C# recognizes a method called Main as signaling the default entry point of execution.

    main 函式作為程式執行的入口點。

  2. 名稱空間 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++,因而比較好理解

  1. indentifiers(識別符號) and keywards(關鍵字)

    • 識別符號,也可以叫做變數名

      ,是程式設計師為類,方法,變數起的名字,程式設計師可以自己定義、修改

      比如: System, Test(類名), Main(函式/方法名), x(變數名), Consloe

    • 關鍵字: 對編譯器而言,有特殊含義的字母,不允許程式設計師自己定義、修改;程式設計師也不能使用關鍵字作為變數名識別符號

      比如: using, void, static, int

    保留的關鍵字:
    在這裡插入圖片描述


  1. 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: * / + - = == %


  1. 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;
  1. 預定義(內建型別 built-in types)的型別: bool, string, int, float;

    在C#中,內建型別為關鍵字(keyword),包含在System 的名稱空間中, 這也就是在程式碼開始部分為什麼使用 using namespace

  2. 使用者自定義型別, 其實就是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的定義。。。

  1. type 的成員(members):
  • data members: ratio
  • function members: UnitConverter(建構函式) 和 Convert
  1. Constructors and instantiation(建構函式和例項化)
  • 對於內建型別,簡單的使用 literal就可以建立一個物件了。
    string myWord = 'Hello World'
  • 對於自定義型別, 需要使用操作符new來建立type的例項物件
    UnitConverter feetToInchesConverter = new UnitConverter (12);
  1. 靜態成員(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.PopulationPanda.Name,編譯時都會報錯

  1. 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編譯器會自動檢查錯誤的,