香蕉视频app

Keep on going never give up.

Let's Go

C# 學習筆記(4)基礎數據類型

C#Lonely2019-04-25 23:56:0178次0條

C#中的數據類型分為兩種:一種是值類型,一種是引用類型所以每個對象要么是值類型的實例,要么是引用類型的實例。

引用類型和值類型都繼承自System.Object類。不同的是,幾乎所有的引用類型都直接從System.Object繼承,而值類型則繼承其子類,即直接繼承System.ValueType。

作為所有類型的基類,System.Object提供了一組方法,這些方法在所有類型中都能找到,其中包含toString方法及clone等方法。System.ValueType直接繼承System.Object,即System.ValueType本身是一個類類型,而不是值類型;System.ValueType沒有添加任何成員,但覆蓋了所繼承的一些方法,使其更適合于值類型。


值類型與引用類型的區別:

香蕉视频app 1. 值類型的數據存儲在內存的棧中;引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的地址。

2. 值類型存取速度快,引用類型存取速度慢。

香蕉视频app 3. 值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針或引用

4. 值類型繼承自System.ValueType,引用類型繼承自System.Object

5. 棧的內存分配是自動釋放;而堆在.NET中會有GC(Garbage Collection 垃圾回收器)來釋放

6. 值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。

7. 值類型變量直接把變量的值保存在堆棧中,引用類型的變量把實際數據的地址保存在堆棧中,而實際數據則保存在堆中。注意,堆和堆棧是兩個不同的概念,在內存中的存儲位置也不相同,堆一般用于存儲可變長度的數據,如字符串類型;而堆棧則用于存儲固定長度的數據,如整型類型的數據int(每個int變量占用四個字節)。由數據存儲的位置可以得知,當把一個值變量賦給另一個值變量時,會在堆棧中保存兩個完全相同的值;而把一個引用變量賦給另一個引用變量,則會在堆棧中保存對同一個堆位置的兩個引用,即在堆棧中保存的是同一個堆的地址。在進行數據操作時,對于值類型,由于每個變量都有自己的值,因此對一個變量的操作不會影響到其它變量;對于引用類型的變量,對一個變量的數據進行操作就是對這個變量在堆中的數據進行操作,如果兩個引用類型的變量引用同一個對象,實際含義就是它們在堆棧中保存的堆的地址相同,因此對一個變量的操作就會影響到引用同一個對象的另一個變量。


  • 值類型變量聲明后,不管是否已經賦值,編譯器為其分配內存。

  • 引用類型當聲明一個類時,只在棧中分配一小片內存用于容納一個地址,而此時并沒有為其分配堆上的內存空間。當使用 new 創建一個類的實例時,分配堆上的空間,并把堆上空間的地址保存到棧上分配的小片空間中。

  • 香蕉视频app ● 值類型的實例通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。

  • ● 引用類型的對象總是在進程堆中分配(動態分配)。


值類型有:數值類型(整型、浮點型、十進制型)、布爾類型、枚舉類型、結構類型

引用類型有:類(基類object、字符串類string、自定義類class)、接口、數組


(一)數值類型

C#中數值類型又分為整型、浮點型、十進制型三種。

1、整型

不同的整數類型會占用大小不同的內存空間(至多64位),所能表達的數字范圍也不盡相同,我們只有知道了每種類型的取值范圍,才能正確使用它們。

png

香蕉视频app 某些類型前面的“u”是unsigned (無符號)的縮寫,表示不能在這些類型的變量中存儲負數。


2、浮點型

浮點型分為單精度浮點數(float)和雙精度浮點數(double)

image


3、十進制型

十進制類型(關鍵字位decimal)表示128位的數據類型。與浮點數相比。它具有更高的精度和更小的范圍,適用于財務和貨幣的計算。

image

如想實數被視為十進制類型,后綴加m或M,如:decimal money = 500.3m;


(二)布爾類型

布爾類型(bool)用于儲存布爾值true(對)和false(錯)。可以直接把布爾值賦給bool變量,也可以將計算結果為布爾類型的表達式賦給bool變量。

示例:

//例1
bool mybool;
int a = 10;
int b = 20;
mybool = a > b;  //如果大于返回true,如果小于返回false;              此時mybool為false
mybool = a < b;  //如果大于返回true,如果小于返回false;              此時mybool為true
mybool = a >= b; //如果大于等于返回true,否則false;                此時mybool為false
mybool = a <= b; //如果小于等于返回true,否則false;                此時mybool為true
mybool = a != b; //如果不等于返回true,否則false;    不等于符號是!=;     此時mybool為true
mybool = a == b; //如果等于返回true,否則false;      等于符號是==;     此時mybool為false
//例2 布爾運算符
bool a = true;
bool b = false;
Console.WriteLine("若 bool a = true; bool b = false;那么 a|| b 返回結果則是:{0}", a || b);  // 或【|】、【||】,有一個true,結果true ,否則false ;運算符前一個操作數為true值時,不再執行后一個操作數的內容;
Console.WriteLine("若 bool a = true; bool b = false;那么 a && b 返回結果則是:{0}", a && b); // 與【&】、【&&】;同時為true時,結果為true;否則false ;
Console.WriteLine("若 bool a = true; bool b = false;那么 a = !b 返回結果則是:{0}", !b);     // !非(取反)b 為false時,則true;
Console.WriteLine("若 bool a = true; bool b = false;那么 a ^ b 返回結果則是:{0}", a ^ b);   // ^有且只有一個;有且只有一個時結果true,否則false;
Console.ReadKey();

例2運行結果:

image.png


(三)字符串類型

string(字符串)類型是System.String的別名,表示由零個或多個Unicode字符組成的不可變序列。可使用“[ n ]”運算符訪問string中的每個字符,其中n為下標。

string類型:在c#語言中,字符串(string)類型是用一對雙引號引起來的字符;string類型具有不可變性

string str = "Hello World!"; // 聲明并初始化
str = "Hi"; //變量重新賦值
Console.WriteLine(str);
Console.ReadKey();

在“Hi”字符串賦給變量str之前,內存首先會重新初始化一塊區域,并把該區域的值初始化為Hi,之后,這塊內存的地址將賦給變量str,而原來存放 "Hello World!"的內存區域則不會被修改。所以string類型具有不可變性。

string類型為引用類型,string變量本身存儲在棧中,而變量所指向的值則存儲在托管堆里。


(四)枚舉類型

枚舉類型屬于值類型,它用于聲明一組命名了的常數。枚舉類型使用enum關鍵字來完成聲明

代碼示例:

//引用命名空間 (這里是引用命名空間的位置)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp //命名空間或項目名稱
{
    //如果希望得到一個固定集合的值,就采用枚舉;
    //在此處聲明枚舉,它與結構的作用很類似,所以位置一樣,但同時,枚舉也可以在結構中被調用;
    //枚舉的聲明位置:將枚舉聲明到命名空間的下面,類的外面,表示這個命名空間下,所有的類都可以使用。
    //枚舉的聲明方法:enum 枚舉名(enum前可以加上修飾符如public公共的公開的,在哪都可以訪問)
    
    public enum week //定義枚舉星期
    {
        //默認情況下,每個值都會根據定義的順序從0開始,自動賦予每個值一個整型。當然,也可以人為指定一個枚舉的基礎值。
        星期一, //0
        星期二, //1
        星期三, //2
        星期四, //3
        星期五, //4
        星期六, //5
        星期日, //6       
    }
    
    public enum sex //定義枚舉性別
    {
        男 = 1,  //人為指定一個枚舉的基礎值
        女 = 5   //人為指定一個枚舉的基礎值
    }
    
    class Program //Program類
    {
        
        static void Main(string[] args)
        {
            //枚舉就是一個變量類型,int,double,string,decimal  (只是枚舉的聲明、賦值、使用方法跟那些普通的變量類型不一樣)
            
            sex gender = sex.男; //(枚舉名 自定義的變量名=枚舉名.值)
            Console.WriteLine(gender); //輸出,輸出結果是男   
                   
            //枚舉與int類型的相互轉換
            week workday = week.星期一;
            Console.WriteLine((int)workday); //(int)實現將枚舉轉換為整型,輸出結果是0
            
            int num = 5;
            Console.WriteLine((sex)num); //(枚舉名)實現將整型轉換為枚舉,輸出結果是女
            
            //枚舉轉換為字符串
            Console.WriteLine(workday); //輸出過程的時候,內部其實已經實現了一個轉換,就是把枚舉值轉換串string類型的,但也可以表面上去指定,也可以不指定。
                     
            Console.WriteLine(workday.ToString()); //例表面上去指定,不能用(string)如: Console.WriteLine((string)workday);只能用workday.ToString();或Convert.ToString(workday);
                        
            //將字符串轉換為枚舉值
            //將字符串轉換成枚舉類型代碼:(要轉換的枚舉類型)Enum.Parse(typeof(要轉換的枚舉類型), "要轉換的字符串")
            string str = "星期六";
            Console.WriteLine((week)Enum.Parse(typeof(week), str));//如果需要轉換的字符串不是數字,而且枚舉值中不包含有該值,就會報異常;例:str = "星期八";報異常;這條語句輸出結果為星期六
                                               
            string str1 = "123456789";
            Console.WriteLine((week)Enum.Parse(typeof(week), str1));//如果需要轉換的字符串是數字,而且枚舉值中不包含有該值,不報異常。這條語句輸出結果為123456789
                                
            Console.ReadKey();
        }
    }
}

默認情況下,枚舉中的每個元素都是int類型,用戶可通過使用冒號來制定一種全新的數字類型。方法如下所示:

enum Gender:byte
{
   Male, //男
   Female,//女
}


(五)、結構體類型

C#中的結構體是一種值類型,結構體與類有著幾乎相同的語法。

定義結構的語法如下:

訪問修飾符 struct 自定義的結構名稱

{

香蕉视频app //定義結構成員

}

香蕉视频app 注意定義好一個結構后,就可以直接聲明相應的變量了,聲明好變量后,通過變量名.成員名 來訪問結構的成員。

香蕉视频app 代碼示例:

//定義結構示例:
public struct UserInfo //定義一個叫UserInfo的結構
{
    //以下是結構的成員
    public string name; //姓名
    public char sex;    //性別
    public int age;     //年齡
}

//調用結構示例:
UserInfo user;
user.name = "張三";
user.sex= '男';
user.age = 18;


(六)、數組類型

數組是一種引用類型,它代表相同類型元素的集合。

語法:type[ ] array = new type[ arrayCount ];

這里的type為數組元素的類型,即可以是值類型,也可以是引用類型。聲明數組時還應注意方括號[ ]應緊跟類型tpye后,變量名array前。訪問數組的元素可以用array[index]這里的index是指數組的下標,下標是從0開始,最大不能超過數組的長度減去1。如果下標超出這個范圍,程序會在運行時出現IndexOutOfRangeException異常。

代碼示例:

//引用命名空間 (這里是引用命名空間的位置)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp //命名空間或項目名稱
{
    class Program //Program類
    {       
        static void Main(string[] args)
        {
            //一維數組的格式:
            int[] arr_1 = new int[] { 3, 2, 1 }; //第一種聲明方式
            int[] arr_2 = { 3, 2, 1 }; //第二種方式聲明一個數組,直接對數組賦初值。
            int[] arr_3; //第三種聲明方式
            arr_3 = new int[] { 3, 2, 1 };
            
            //二維數組的格式:
            int[,] arr_4 = new int[,] { { 1, 2, 3 }, { 1, 2, 3 } }; //不定長
            int[,] arr_5 = new int[2, 2] { { 1, 2, }, { 1, 2, } }; //定長
            
            //三維數組的格式:
            int[,,] arr_6 = new int[4, 2, 3];
            
            double zf = 0; //定義變量總分,初始值為0;
            double[] cj; //數組的定義,定義一個名為cj的數組,數組有多少個元素暫時不知;
            cj = new double[10]; //數組的實例化,為這個數組分配10個存儲空間(能存儲10個double類型的的內存空間);
            
            Console.WriteLine("請輸入10名學生的單科成績:");
            for (int i = 0; i < cj.Length; i++) //對數組元素進行賦值
            {
                cj[i] = double.Parse(Console.ReadLine()); //數組通過下標來訪問,接收用戶輸入的成績,Console.ReadLine();用于接受用戶的輸入,輸入類型默認為字符串string類型,所以需要double.Parse類型轉換
                        
            }
            
            for (int i = 0; i < cj.Length; i++)//輸出數組中每一個元素的值
            {
                if (cj[i] < 60) //第幾個成績小于60
                {
                    Console.WriteLine("\n第{0}同學成績為不及格,成績為:{1}分\r\n", i + 1, cj[i]);//數組下標是從0開始的
                }
                zf = zf + cj[i]; //總分             
            }
            
            Console.WriteLine("單科成績總分為:{0}平均分為:{1}分", zf, zf / cj.Length);
            Console.ReadKey();
            
        }
    }
}





暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!