1. 變量
形式:datatype identifier
例如:int i;
該語句聲明瞭變量i,但是不能再編譯器中使用這個變量i,因爲你還沒有對他進行初始化。
賦值:i = 0;
上述分爲兩句對一個變量進行了聲明和賦值,還可以用一條語句對其聲明並初始化他的值
int i = 10;
如果一行語句中聲明瞭不同的變量,那麼他們是同一數據類型。例如:
int x = 0,y = 1;//x,y是同一數據類型
要是向聲明不同數據類型的變量,必須需要多條語句
int x = 0;
bool IsFull = false;
這樣寫是不對的
int x = 0,bool IsFull = false
(1) 初始化變量
大多數編譯器中將一個未進行初始化的編輯爲警告,而在C#編譯器中將未初始化的標記爲錯誤
C#中確保變量使用前進行初始化的兩個方法:
a:變量是類和結構中的字段,如果沒有顯式初始化,則闖將這些變量時默認爲0;
b:方法的局部變量必須在代碼中顯示初始化,才能在之後的語句中使用他的值;
在C#中不能使用下列語句:
static int Main()
{
int d;
WriteLine(d);
return 0;
}
(2) 類型推斷
關鍵字----var
例如:
var i = 10;
將變量聲明中的變量類型用var代替,編譯器會根據變量的值來確定變量的類型,因此上述語句等同於int i = 10;
例子:
using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var name = "wjs";
var age = 25;
var isRabbit = true;
Type nameType = name.GetType();
Type ageType = age.GetType();
Type isRabbitType = isRabbit.GetType();
System.Console.WriteLine($"name is type{nameType}");
System.Console.WriteLine($"age is type{ageType}");
System.Console.WriteLine($" isRabbit is type{isRabbitType}");
Thread.Sleep(5000);//睡眠5000毫秒,也就是5秒
}
}
}
結果
(3)變量的作用域
作用域:可以訪問該變量的代碼區域
a:只要類在某個作用域內,其字段也在該作用域內;
b:局部變量存在於表示聲明該變量的塊語句或方法結束的右花括號之前的作用域內;
c:在for,while或類似語句中聲明的局部變量存在於該循環體內
(a)局部變量的作用域衝突
例如:
using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
int j = 0;
for (int i = 0; i < 10; i++)
{
int j = 30;
System.Console.WriteLine(j+i);
}
Thread.Sleep(5000);//睡眠5000毫秒,也就是0.5秒
}
}
}
結果
(b)字段和局部變量的作用域衝突
例如:
using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static int j = 10;
static void Main(string[] args)
{
int j = 30;
System.Console.WriteLine(j);
System.Console.WriteLine(Program.j);
Thread.Sleep(5000);//睡眠5000毫秒,也就是0.5秒
}
}
}
結果:
2. 常量
在聲明變量時在數據類型前加const,就可以定義爲常量、
注意:
a:常量必須在聲明時初始化,指定值後,不能修改。
b:常量的值必須能在編譯時用於計算。
C:常量是隱式靜態的。但聲明時不需要加static;
3.預定義的數據類型
(1)值類型和引用類型加粗樣式
a、值類型:直接儲存值,存儲在堆棧。
b、引用類型:儲存對值的引用,存儲在託管堆(managed heap)上。
(2)預定義的值類型
a、整形
名稱 | .Net類型 | 說明 | 範圍 |
---|---|---|---|
sbyte | System.SByte | 8位有符號整數 | -127~127 |
short | System.Int16 | 16位有符號整數 | -32768~32768 |
int | System.Int32 | 32位有符號整數 | -2147483648~2147483648 |
long | System.Int64 | 64位有符號整數 | -9223372036854775807~9223372036854775807 |
byte | System.Byte | 8位無符號整數 | 0~255 |
ushort | System.UInt16 | 16位無符號整數 | 0~65535 |
uint | System.UInt32 | 32位無符號整數 | 0~4294967295 |
ulong | System.UInt64 | 64位無符號整數 | 0~18446744073709551615 |
有些類型的名稱與C++或java類型一致,但定義不同。例如:在C#中int總是32位有符號整數。而在C++中,int是有符號整數,位數是由平臺決定(在windows上是32位)。在C#中,所有數據類型位數都與平臺無關
b、浮點型
名稱 | .Net類型 | 說明 | 位數 |
---|---|---|---|
float | System.Single | 32位單精度浮點數 | 7 |
double | System.Double | 64位雙精度浮點數 | 15/16 |
decimal | System.Declmal | 128位高精度十進制表示法 | 28 |
如果將數據類型指定爲float,需要在後面加F(或f)
例如:
float f = 12.3F;
decimal類型是,NET和C#數據類型提供的一種財務計算的專用類型,如果將數字指定爲decimal類型,需要在後面加上M(或m);
例如decimal d = 12.30M;
c、bool類型
名稱 | .Net類型 | 說明 | 位數 |
---|---|---|---|
bool | System.Boolean | 表示true或false | NA |
d、字符類型
名稱 | .Net類型 | 值 |
---|---|---|
char | System.Char | 表示一個16位的(Unicode)字符 |
char類型的字面量是用單引號引起來的,如‘A’,不能用雙引號,編譯器會將用雙引號引起來的看作字符串,他們可以用轉義序列表示,如下表
轉義序列 | 字符 |
---|---|
\’ | 單引號 |
\’’ | 雙引號 |
\\ | 反斜槓 |
\0 | 空 |
\a | 警告 |
\b | 退格 |
\f | 換頁 |
\n | 換行 |
\r | 回車 |
\t | 水平製表符 |
\v | 垂直製表符 |
3.預定義的引用類型
名稱 | .Net類型 | 說明 |
---|---|---|
object | System.Object | 根類型 |
string | System.String | 字符串類型 |
string是一個引用類型,被分配到堆上,而不是棧上,將一個字符串S1賦值給S2,S1、S2會引用一塊內存空間的同一個字符串,而修改其中一個字符串,就會創建一個全新的string對象,另一個不會發生改變。
示例程序:
using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
string s1 = "1234";
string s2 = s1;
System.Console.WriteLine(s1);
System.Console.WriteLine(s2);
s2 = "abcd";
System.Console.WriteLine(s1);
System.Console.WriteLine(s2);
Thread.Sleep(5000);//睡眠5000毫秒,也就是5秒
}
}
}
結果:
string中可以包含轉義序列,因爲轉義序列以一個反斜槓開頭,所以不能在字符串中使用沒有經過轉義的反斜槓字符。
例如:
string filePath = “F:\AR.zip” (錯誤示範)
string filePath = "F:\\AR.zip"
或
string filePath = @"F:\AR.zip"
4.程序流控制
因爲好多內容與C、C++相同,故此省略,只會列出不同點
a、switch語句
switch語句中的case塊順序無關緊要,但是任意兩個case子句都不能相同(包括值相同的不同常量),在C#中,可以把字符串當作測試變量
b、foreach循環:
可以迭代集合中的每一項,假定ArrayOfInts爲整形數組
foreach(int temp in ArrayOfInts)
{
WriteLine(temp);
}
注意: 不能用foreach修改數組中值,錯誤示範
foreach(int temp in ArrayOfInts)
{
temp++;
}
c、goto語句(名聲不好,一般不允許使用)
goto語句可以直接跳轉到程序中用標籤指定的另一行(標籤是一個標識符加一個冒號)
using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
goto label;
System.Console.WriteLine("Hello World");
label:
System.Console.WriteLine("跳轉到這裏");
Thread.Sleep(5000);//睡眠5000毫秒,也就是5秒
}
}
}
結果:
限制:不能跳到像for循環這樣的代碼塊中,也不能跳出。不能推出try…catch後面的finally中。
5.枚舉
枚舉是用戶定義的整數類型,聲明時指定可以包含的一組可接受的值
優點:
a、易於維護,有助於確保給變量指定合法的、期望的值
b、使代碼清晰
c、使代碼易於輸入
定義示範:
public enum TimeOfDay
{
Morning = 0,
Afternoon = 1,
Evening = 2
}
6.名稱空間
名稱空間提供了一種組織相關類和其他類型的方式,是一種邏輯組合。把一個類型放在名稱空間中,可以有效的給這個類型制定一個較長的名稱,該名稱包括他的名稱空間,名稱之間用“.”隔開,最後是類名。這樣,有相同短命的類就可以在同一個程序中使用了。
也可以在名稱空間中嵌套其他名稱空間,例如:
namespace s1
{
namespace s2
{
namespace s3
{
}
}
}
名稱空間與程序集無關,同一個程序集中可以有不同的名稱空間,也可以在不同的程序集中定義同一個名稱空間。
using語句:
文件頂部列出類所在的名稱空間,前面加上using關鍵字。
例如:
using System;
......
Console.WriteLine("Hello World");
等價於
System.Console.WriteLine("Hello World");
7.使用註釋
單行註釋://…
多行註釋:/(星號)…(星號)/(“星號”代表“*”)、
可以把多行註釋放在一行代碼中,實現註釋和代碼共存
XML文檔
C#會根據特定的註釋自動創建XML格式的文檔說明。這些註釋都是單行註釋,已///開頭
8.C#預處理器指令
(1)#define和#undef
#define用法:
#define DEBUG
他告訴編譯器存在給定名稱的符號。有點類似於聲明變量,但這個變量沒有真正的值,只是存在。不是實際代碼的一部分,只是在編譯器編譯代碼時存在。在C#代碼中沒有任何意義
#undef DEBUG
#undef正好相反:刪除符號的定義
如果DEBUG不粗暴在,則上述語句沒有任何意義。如果有DEBUG存在,同樣DEBUG頁不起作用了。
必須將#define和#undef放在源文件開頭位置
(2)#if、#elif、#else、#endif
如果定義了DEBUG這個符號,則a = 1會被執行,否則不會
#elif(else if)這四個像if…else if,else 語句
(3)#warning、#error
編譯時遇到#warning編譯器會發出一個警告,內容爲#warning後面的文本
編譯時遇到#error編譯器會發出一個錯誤,並立即停止編譯,錯誤提示內容爲#error後面的文本
(4)#region、#endregion
他們用於把一段代碼視爲有給定名稱的一個塊,並不影響編譯。可以被某些編譯器識別,可以使這些代碼在屏幕上更好的佈局
(5)#line、#pragma
不常用,略。如有興趣,點擊傳送門。https://www.cnblogs.com/bq-blog/archive/2012/07/27/2611819.html(非原創)