C#基礎(chǔ)+高級(jí)

C#集合相關(guān)知識(shí)

C#里面Collection下面ArrayList

1尖坤、動(dòng)態(tài)數(shù)組 Array List:
動(dòng)態(tài)數(shù)組(ArrayList)代表了可被單獨(dú)索引的對(duì)象的有序集合。它基本上可以替代一個(gè)數(shù)組。但是贮缕,與數(shù)組不同的是俺榆,
您可以使用索引在指定的位置添加和移除項(xiàng)目罐脊,動(dòng)態(tài)數(shù)組會(huì)自動(dòng)重新調(diào)整它的大小萍桌。它也允許在列表中進(jìn)行動(dòng)態(tài)內(nèi)存
分配、增加恃逻、搜索寇损、排序各項(xiàng)矛市。

表列出了 ArrayList 類的一些常用的 屬性:

屬性 描述
Capacity 獲取或設(shè)置 ArrayList 可以包含的元素個(gè)數(shù)浊吏。
Count 獲取 ArrayList 中實(shí)際包含的元素個(gè)數(shù)。
IsFixedSize 獲取一個(gè)值卿捎,表示 ArrayList 是否具有固定大小午阵。
IsReadOnly 獲取一個(gè)值底桂,表示 ArrayList 是否只讀。
IsSynchronized 獲取一個(gè)值于个,表示訪問(wèn) ArrayList 是否同步(線程安全)厅篓。
Item[Int32] 獲取或設(shè)置指定索引處的元素羽氮。
SyncRoot 獲取一個(gè)對(duì)象用于同步訪問(wèn) ArrayList档押。

1祈纯、public virtual int Add( object value );
在 ArrayList 的末尾添加一個(gè)對(duì)象腕窥。

2、public virtual void AddRange( ICollection c );
在 ArrayList 的末尾添加 ICollection 的元素革娄。

3拦惋、public virtual void Clear();
從 ArrayList 中移除所有的元素安寺。

4厕妖、public virtual bool Contains( object item );
判斷某個(gè)元素是否在 ArrayList 中挑庶。

5举畸、public virtual int IndexOf(object);
返回某個(gè)值在 ArrayList 中第一次出現(xiàn)的索引抄沮,索引從零開(kāi)始叛买。

6率挣、public virtual void Insert( int index, object value );
在 ArrayList 的指定索引處椒功,插入一個(gè)元素动漾。

7谦炬、public virtual void InsertRange( int index, ICollection c );
在 ArrayList 的指定索引處键思,插入某個(gè)集合的元素。

8赔桌、public virtual void Remove( object obj );
從 ArrayList 中移除第一次出現(xiàn)的指定對(duì)象疾党。

9雪位、public virtual void RemoveAt( int index );
移除 ArrayList 的指定索引處的元素香罐。

10庇茫、public virtual void RemoveRange( int index, int count );
從 ArrayList 中移除某個(gè)范圍的元素旦签。

11、public virtual void Reverse();
逆轉(zhuǎn) ArrayList 中元素的順序淋淀。

12朵纷、public virtual void SetRange( int index, ICollection c );
復(fù)制某個(gè)集合的元素到 ArrayList 中某個(gè)范圍的元素上。

13搅吁、public virtual void Sort();
對(duì) ArrayList 中的元素進(jìn)行排序谎懦。

14、public virtual void TrimToSize();
設(shè)置容量為 ArrayList 中元素的實(shí)際個(gè)數(shù)享甸。

eg:
using System;
using System.Collections;

namespace CollectionApplication
{
class Program
{
static void Main(string[] args)
{
ArrayList al = new ArrayList();

        Console.WriteLine("Adding some numbers:");
        al.Add(45);
        al.Add(78);
        al.Add(33);
        al.Add(56);
        al.Add(12);
        al.Add(23);
        al.Add(9);
       
        Console.WriteLine("Capacity: {0} ", al.Capacity);   //結(jié)果:  Capacity: 8
        Console.WriteLine("Count: {0}", al.Count);    //結(jié)果: Count: 7
                 
        Console.Write("Content: ");
        foreach (int i in al)
        {
            Console.Write(i + " ");     //結(jié)果:Content : 45 78 33 56 12 23 9
        }
        Console.WriteLine();
        Console.Write("Sorted Content: ");
        al.Sort();
        foreach (int i in al)
        {
            Console.Write(i + " ");    //結(jié)果: Content: 9 12 23 33 45 56 78
        }
        Console.WriteLine();
        Console.ReadKey();
    }
}

}

C#里面Collection下面Queue(隊(duì)列)

隊(duì)列(Queue)代表了一個(gè)先進(jìn)先出的對(duì)象集合。當(dāng)您需要對(duì)各項(xiàng)進(jìn)行先進(jìn)先出的訪問(wèn)時(shí)瓷翻,則使用隊(duì)列齐帚。
當(dāng)您在列表中添加一項(xiàng)湘今,稱為入隊(duì)摩瞎,當(dāng)您從列表中移除一項(xiàng)時(shí),稱為出隊(duì)上渴。

下表列出了 Queue 類的一些常用的 屬性:

屬性 描述
Count 獲取 Queue 中包含的元素個(gè)數(shù)稠氮。

Queue 類的一些常用的 方法:
1 public virtual void Clear();
從 Queue 中移除所有的元素。

2 public virtual bool Contains( object obj );
判斷某個(gè)元素是否在 Queue 中。

3 public virtual object Dequeue();
移除并返回在 Queue 的開(kāi)頭的對(duì)象恃慧。

4 public virtual void Enqueue( object obj );
向 Queue 的末尾添加一個(gè)對(duì)象彪薛。

5 public virtual object[] ToArray();
復(fù)制 Queue 到一個(gè)新的數(shù)組中少态。

6 public virtual void TrimToSize();
設(shè)置容量為 Queue 中元素的實(shí)際個(gè)數(shù)彼妻。

eg:
using System;
using System.Collections;

namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Queue q = new Queue();

     q.Enqueue('A');
     q.Enqueue('M');
     q.Enqueue('G');
     q.Enqueue('W');
     
     Console.WriteLine("Current queue: ");
     foreach (char c in q)
        Console.Write(c + " ");
     Console.WriteLine();
     q.Enqueue('V');
     q.Enqueue('H');
     Console.WriteLine("Current queue: ");        
     foreach (char c in q)
        Console.Write(c + " ");
     Console.WriteLine();
     Console.WriteLine("Removing some values ");
     char ch = (char)q.Dequeue();
     Console.WriteLine("The removed value: {0}", ch);
     ch = (char)q.Dequeue();
     Console.WriteLine("The removed value: {0}", ch);
     Console.ReadKey();
  }

}
}

結(jié)果:
Current queue:
A M G W
Current queue:
A M G W V H
Removing values
The removed value: A
The removed value: M

C#里面Collection下面SortedList

SortedList 類代表了一系列按照鍵來(lái)排序的鍵/值對(duì),這些鍵值對(duì)可以通過(guò)鍵和索引來(lái)訪問(wèn)炮温。
排序列表是數(shù)組和哈希表的組合。它包含一個(gè)可使用鍵或索引訪問(wèn)各項(xiàng)的列表。如果您使用索引訪問(wèn)各項(xiàng)涛癌,
則它是一個(gè)動(dòng)態(tài)數(shù)組(ArrayList),如果您使用鍵訪問(wèn)各項(xiàng),則它是一個(gè)哈希表(Hashtable)笨鸡。集合中的
各項(xiàng)總是按鍵值排序。

下表列出了 SortedList 類的一些常用的 屬性:

屬性 描述
Capacity 獲取或設(shè)置 SortedList 的容量。
Count 獲取 SortedList 中的元素個(gè)數(shù)倦踢。
IsFixedSize 獲取一個(gè)值,表示 SortedList 是否具有固定大小褂微。
IsReadOnly 獲取一個(gè)值,表示 SortedList 是否只讀肥矢。
Item 獲取或設(shè)置與 SortedList 中指定的鍵相關(guān)的值灭抑。
Keys 獲取 SortedList 中的鍵忘嫉。
Values 獲取 SortedList 中的值。

1 public virtual void Add( object key, object value );
向 SortedList 添加一個(gè)帶有指定的鍵和值的元素。

2 public virtual void Clear();
從 SortedList 中移除所有的元素。

3 public virtual bool ContainsKey( object key );
判斷 SortedList 是否包含指定的鍵响巢。

4 public virtual bool ContainsValue( object value );
判斷 SortedList 是否包含指定的值券腔。

5 public virtual object GetByIndex( int index );
獲取 SortedList 的指定索引處的值。

6 public virtual object GetKey( int index );
獲取 SortedList 的指定索引處的鍵。

7 public virtual IList GetKeyList();
獲取 SortedList 中的鍵商叹。

8 public virtual IList GetValueList();
獲取 SortedList 中的值。

9 public virtual int IndexOfKey( object key );
返回 SortedList 中的指定鍵的索引过蹂,索引從零開(kāi)始扳躬。

10 public virtual int IndexOfValue( object value );
返回 SortedList 中的指定值第一次出現(xiàn)的索引,索引從零開(kāi)始偶摔。

11 public virtual void Remove( object key );
從 SortedList 中移除帶有指定的鍵的元素嘲叔。

12 public virtual void RemoveAt( int index );
移除 SortedList 的指定索引處的元素。

13 public virtual void TrimToSize();
設(shè)置容量為 SortedList 中元素的實(shí)際個(gè)數(shù)。

eg:
using System;
using System.Collections;

namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
SortedList sl = new SortedList();

     sl.Add("001", "Zara Ali");
     sl.Add("002", "Abida Rehman");
     sl.Add("003", "Joe Holzner");
     sl.Add("004", "Mausam Benazir Nur");
     sl.Add("005", "M. Amlan");
     sl.Add("006", "M. Arif");
     sl.Add("007", "Ritesh Saikia");

     if (sl.ContainsValue("Nuha Ali"))
     {
        Console.WriteLine("This student name is already in the list");   
     }
     else
     {
        sl.Add("008", "Nuha Ali");
     }

     // 獲取鍵的集合
     ICollection key = sl.Keys;

     foreach (string k in key)
     {
        Console.WriteLine(k + ": " + sl[k]);
     }
  }

}
}
//注意罪既,SortList會(huì)根據(jù)里面key值進(jìn)行升序排序

結(jié)果:001: Zara Ali
002: Abida Rehman
003: Joe Holzner
004: Mausam Banazir Nur
005: M. Amlan
006: M. Arif
007: Ritesh Saikia
008: Nuha Ali

C#里面Collection下面Stack(棧)

堆棧(Stack)代表了一個(gè)后進(jìn)先出的對(duì)象集合丢间。當(dāng)您需要對(duì)各項(xiàng)進(jìn)行后進(jìn)先出的訪問(wèn)時(shí),則使用堆棧其垄。
當(dāng)您在列表中添加一項(xiàng),稱為推入元素喜滨,當(dāng)您從列表中移除一項(xiàng)時(shí)捉捅,稱為彈出元素。

下表列出了 Stack 類的一些常用的 屬性:

屬性 描述
Count 獲取 Stack 中包含的元素個(gè)數(shù)虽风。

下表列出了 Stack 類的一些常用的 方法:

序號(hào) 方法名 & 描述
1 public virtual void Clear();
從 Stack 中移除所有的元素棒口。

2 public virtual bool Contains( object obj );
判斷某個(gè)元素是否在 Stack 中。

3 public virtual object Peek();
返回在 Stack 的頂部的對(duì)象辜膝,但不移除它无牵。

4 public virtual object Pop();
移除并返回在 Stack 的頂部的對(duì)象。

5 public virtual void Push( object obj );
向 Stack 的頂部添加一個(gè)對(duì)象厂抖。

6 public virtual object[] ToArray();
復(fù)制 Stack 到一個(gè)新的數(shù)組中茎毁。

eg:

using System;
using System.Collections;

namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Stack st = new Stack();

        st.Push('A');
        st.Push('M');
        st.Push('G');
        st.Push('W');
       
        Console.WriteLine("Current stack: ");
        foreach (char c in st)
        {
            Console.Write(c + " ");
        }
        Console.WriteLine();
       
        st.Push('V');
        st.Push('H');
        Console.WriteLine("The next poppable value in stack: {0}",
        st.Peek());
        Console.WriteLine("Current stack: ");          
        foreach (char c in st)
        {
           Console.Write(c + " ");
        }
        Console.WriteLine();

        Console.WriteLine("Removing values ");
        st.Pop();
        st.Pop();
        st.Pop();
       
        Console.WriteLine("Current stack: ");
        foreach (char c in st)
        {
           Console.Write(c + " ");
        }
    }
}

}

結(jié)果:
Current stack:
W G M A
The next poppable value in stack: H
Current stack:
H V W G M A
Removing values
Current stack:
G M A

C#里面繼承、接口忱辅、多態(tài)

C#里面接口七蜘、繼承、多態(tài)

接口使用的注意事項(xiàng):
1墙懂、接口方法不能用public abstract等修飾橡卤。接口內(nèi)不能有字段變量,構(gòu)造函數(shù)损搬。
2碧库、接口內(nèi)可以定義屬性(有g(shù)et和set的方法)。如string color { get ; set ; }這種巧勤。
3嵌灰、實(shí)現(xiàn)接口時(shí),必須和接口的格式一致颅悉。
4沽瞭、必須實(shí)現(xiàn)接口的所有方法。
5剩瓶、接口中只能包含方法驹溃、屬性柒瓣、索引器和事件的聲明。不允許聲明成員上的修飾符吠架,即使是pubilc都不行,
因?yàn)榻涌诔蓡T總是公有的搂鲫,也不能聲明為虛擬和靜態(tài)的傍药。如果需要修飾符,最好讓實(shí)現(xiàn)類來(lái)聲明魂仍。拐辽、
6、接口也可以彼此繼承擦酌,就象類的繼承一樣俱诸。但是如果一個(gè)接口繼承上一個(gè)接口的話,一樣要繼承上一個(gè)接口所有方法赊舶。
7睁搭、C#中的接口是獨(dú)立于類來(lái)定義的。這與 C++模型是對(duì)立的笼平,在 C++中接口實(shí)際上就是抽象基類园骆。
8、接口可以定義方法寓调、屬性和索引锌唾。所以,對(duì)比一個(gè)類夺英,接口的特殊性是:當(dāng)定義一個(gè)類時(shí)晌涕,可以派生自多重接口,
而你只能可以從僅有的一個(gè)類派生痛悯。
9余黎、一個(gè)接口定義一個(gè)只有抽象成員的引用類型。C#中一個(gè)接口實(shí)際所做的灸蟆,僅僅只存在著方法標(biāo)志驯耻,
但根本就沒(méi)有執(zhí)行代碼。這就暗示了不能實(shí)例化一個(gè)接口炒考,只能實(shí)例化一個(gè)派生自該接口的對(duì)象可缚。

C#里面接口隔離

什么是接口隔離原理

根據(jù)一組方法斋枢,最好使用許多小接口來(lái)代替一個(gè)胖接口帘靡,每個(gè)小接口服務(wù)一個(gè)子模塊

簡(jiǎn)單點(diǎn)說(shuō),客戶端需要什么功能瓤帚,就提供什么接口描姚,對(duì)于客戶端不需要的接口不應(yīng)該強(qiáng)行要求其依賴涩赢;
類之間的依賴應(yīng)該建立在最小的接口上面,這里最小的粒度取決于單一職責(zé)原則的劃分轩勘。
自我理解就是將一個(gè)大接口的各個(gè)方法和屬性細(xì)分到許多小接口筒扒,然后就可以根據(jù)實(shí)現(xiàn)類的需要選擇相應(yīng)的接口實(shí)現(xiàn),
避免一個(gè)被實(shí)現(xiàn)接口中太多用不到的方法绊寻,還得被實(shí)現(xiàn)花墩。

接口隔離之前
示例
public interface IProduct {
int ID { get; set; }
double Weight { get; set; }
int Stock { get; set; }
int Inseam { get; set; }
int WaistSize { get; set; }
}
public class Jeans : IProduct {
public int ID { get; set; }
public double Weight { get; set; }
public int Stock { get; set; }
public int Inseam { get; set; }
public int WaistSize { get; set; }
}
public class BaseballCap : IProduct {
public int ID { get; set; }
public double Weight { get; set; }
public int Stock { get; set; }
public int Inseam { get; set; }
public int WaistSize { get; set; }
public int HatSize { get; set; }
}


接口隔離后
示例
public interface IProduct {
int ID { get; set; }
double Weight { get; set; }
int Stock { get; set; }
}
public interface IPants {
int Inseam { get; set; }
int WaistSize { get; set; }
}
public interface IHat {
int HatSize { get; set; }
}
public class Jeans : IProduct, IPants {
public int ID { get; set; }
public double Weight { get; set; }
public int Stock { get; set; }
public int Inseam { get; set; }
public int WaistSize { get; set; }
}
public class BaseballCap : IProduct, IHat {
public int ID { get; set; }
public double Weight { get; set; }
public int Stock { get; set; }
public int HatSize { get; set; }
}

C#里面文件流

C#獲得桌面絕對(duì)路徑

可以使用Environment.SpecialFolder來(lái)獲取當(dāng)前用戶的桌面路徑
string desktopPath =Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
System.Environment類提供有關(guān)當(dāng)前環(huán)境和平臺(tái)的信息。
eg:
public static void Main(){
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); //如果要訪問(wèn)桌面文件加上+@"\文件名.txt";
Console.WriteLine($"Desktop Path: {desktopPath}");
Console.ReadLine();
}

上面代碼的輸出是:
Desktop Path: C:\Users\UserName\Desktop

C#里面string類里面常用方法

1.ToArray() (ToCharArray())
ToCharArray (int startIndex, int length);
參數(shù)
startIndex
此實(shí)例內(nèi)子字符串的起始位置澄步。
length
此實(shí)例內(nèi)子字符串的長(zhǎng)度冰蘑。

ToCharArray()用于將字符串變?yōu)樽址麛?shù)組。
eg: char[ ] arr=str.ToCharArray( );

2.Contains()
Contains (string value);
參數(shù)
value
要搜尋的字符串村缸。
可判斷字符中是否出現(xiàn)在字符串中祠肥,返回bool型
eg:
string name = "raoguang is a chinese!";
string k = "";
char[] chars = name.ToArray();
foreach (char a in chars)
{
if (!(k.Contains(a)))
{
k = k + a;
}
}
Console.WriteLine(k.ToString());
Console.ReadKey();

返回結(jié)果:raogun ische!

3.Insert()
Insert (int startIndex, string value);
參數(shù)
startIndex
插入的從零開(kāi)始的索引位置。
value
要插入的字符串梯皿。
返回String 類型數(shù)據(jù)
eg:
string exam = "raoguang is a chinese!";
string example = exam.Insert(8," and his family ");
Console.WriteLine(example);
Console.ReadKey();
返回結(jié)果:raoguang and his family is a chinese!

4.ToLower() ----(轉(zhuǎn)化字符串為小寫) ToUpper() ----(轉(zhuǎn)化字符串為大寫)
eg:
string a=“How are you”;
a=a.ToUpper(); //a=“HOW ARE YOU”;

5.IndexOf()
String.IndexOf 方法 (value, [startIndex], [count])
報(bào)告指定字符在此實(shí)例中的第一個(gè)匹配項(xiàng)的索引仇箱。搜索從指定字符位置開(kāi)始,并檢查指定數(shù)量的字符位置东羹。
參數(shù)含義:
   value
  要查找的 Unicode 字符工碾。 對(duì) value 的搜索區(qū)分大小寫。
   startIndex(Int32)
  可選項(xiàng)百姓,搜索起始位置渊额。不設(shè)置則從0開(kāi)始。
   count(Int32)
  可選項(xiàng)垒拢,要檢查的字符位數(shù)旬迹。
  返回值
  如果找到該字符,則為 value 的索引位置求类;否則如果未找到奔垦,則為 -1。
eg:
string exam = "raoguang is a chinese!";
int position = exam.IndexOf("c");
Console.WriteLine(position);
Console.ReadKey();
返回結(jié)果:14

6.Substring()
截?cái)嘧址?br> eg:
string exam = "raoguang is a chinese!";
string a = exam.Substring(3);
string b = exam.Substring(3,5);
Console.WriteLine(a);
Console.WriteLine(b);
Console.ReadKey();

返回結(jié)果:
guang is a chinese!
guang

7.Trim()
string strEscape = “\r;\n”;
strSrc = strSrc.Trim(strEscape.ToCharArray());
刪除字符串頭部和尾部的回車符尸疆。

C#中Trim()椿猎、TrimStart()、TrimEnd()的用法:
這三個(gè)方法用于刪除字符串頭尾出現(xiàn)的某些字符寿弱。
Trim()刪除字符串頭部及尾部出現(xiàn)的空格犯眠,刪除的過(guò)程為從外到內(nèi),直到碰到一個(gè)非空格的字符為止症革,所以不管前后有多少個(gè)連續(xù)的空格都會(huì)被刪除掉筐咧。
TrimStart()只刪除字符串的頭部的空格。
TrimEnd()只刪除字符串尾部的空格。

如果這三個(gè)函數(shù)帶上字符型數(shù)組的參數(shù)量蕊,則是刪除字符型數(shù)組中出現(xiàn)的任意字符铺罢。
如Trim(“abcd”.ToCharArray())就是刪除字符串頭部及尾部出現(xiàn)的a或b或c或d字符,刪除的過(guò)程直到碰到一個(gè)既不是a也不是b也不是c也不是d的字符才結(jié)束残炮。
這里最容易引起的誤會(huì)就是以為刪除的是"abcd"字符串韭赘。
如下例:
string s = " from dual union all ";
s = s.Trim().TrimEnd(“union all”.ToCharArray());
ps:ToCharArray()是將字符串復(fù)制為字符數(shù)組
可能有人以為上面s的最終結(jié)果是"from dual",
但真正的結(jié)果是"from d"势就。
需要注意的是這種寫法執(zhí)行的刪除對(duì)象是字符數(shù)組中出現(xiàn)的任意字符辞居,而不是這些字符連在一起組成的字符串!

eg:
string exam = " raoguang is a chinese ";
string a = exam.Trim();
Console.WriteLine(a);
string b = exam.TrimStart();
Console.WriteLine(b);
string c = exam.TrimEnd();
Console.WriteLine(c);
string d = exam.Trim().TrimEnd("chinese".ToCharArray());
Console.WriteLine(d);
string e = exam.Trim().TrimStart("chinese".ToCharArray());
Console.WriteLine(e);
string f = exam.Trim("chinese".ToCharArray());
Console.WriteLine(f);
返回結(jié)果:
raoguang is a chinese
raoguang is a chinese
raoguang is a chinese
raoguang is a
raoguang is a chinese
raoguang is a chinese

8.Split()
將字符串劃分為字符串?dāng)?shù)組
eg:
string exam = "how are you";
string[] a = exam.Split(" ");
foreach (string b in a)
{
Console.WriteLine(b);
}
返回結(jié)果:
how
are
you

9.Replace()
Replace(Char, Char)
返回一個(gè)新字符串蛋勺,其中此實(shí)例中出現(xiàn)的所有指定 Unicode 字符都替換為另一個(gè)指定的 Unicode 字符。
Replace(String, String)
返回一個(gè)新字符串鸠删,其中當(dāng)前實(shí)例中出現(xiàn)的所有指定字符串都替換為另一個(gè)指定的字符串抱完。
eg:
string exam = "how are you";
string a = exam.Replace(" ","|");
Console.WriteLine(a);
string b = exam.Replace("are","do");
Console.WriteLine(b);
返回結(jié)果:
how|are|you
how do you

10、String.Join 方法 (String, String[])
在指定 String 數(shù)組的每個(gè)元素之間串聯(lián)指定的分隔符 String刃泡,從而產(chǎn)生單個(gè)串聯(lián)的字符串巧娱。

eg:
string[] a = {"we are one","and you","what's your mean?"};
string b = string.Join("-",a);
Console.WriteLine(b);
返回結(jié)果:
we are one-and you-what's your mean?

11、public bool StartsWith( string value )
判斷字符串實(shí)例的開(kāi)頭是否匹配指定的字符串烘贴。
eg:
string a = "abc*d";
bool flag=a.StartsWith("a
"); //return true
bool flag=a.StartsWith("a
b") //return false

12禁添、public bool EndsWith( string value )
判斷 string 對(duì)象的結(jié)尾是否匹配指定的字符串。
eg:
string a = "abcd";
bool flag=a.StartsWith("
d"); //return true
bool flag=a.StartsWith("a*b") //return false

13桨踪、String.IsNullOrEmpty()方法
String.IsNullOrEmpty()方法是String類的內(nèi)置方法老翘,用于檢查字符串是Null還是Empty
eg:
string str1="";
string str2=null;
string str3=" ";
string str4="1112";

bool flag=string.IsNullOrEmpty(str1); //true
bool flag=string.IsNullOrEmpty(str2); //true
bool flag=string.IsNullOrEmpty(str3); //false
bool flag=string.IsNullOrEmpty(str4); //false

C#里面反射

反射:用來(lái)操作元數(shù)據(jù)(metadata)的一個(gè)類庫(kù)。(可以把反射當(dāng)成一個(gè)小工具來(lái)讀取或者操作元數(shù)據(jù))

為什么要通過(guò)反射間接操作锻离?
1铺峭、因?yàn)槲覀冃枰獎(jiǎng)討B(tài)。
2汽纠、讀取私有對(duì)象卫键。

哪些地方用到了反射?
asp.net MVC 虱朵、ORM莉炉、LOC、AOP幾乎所有的褲架都會(huì)使用反射

C#里面@符號(hào)和$符號(hào)的作用

(1)@字符的作用
C#字符串中不能使用沒(méi)有經(jīng)過(guò)轉(zhuǎn)義的反斜杠字符 " \ "碴犬,而需要兩個(gè)反斜杠字符來(lái)表示它:
string filePath=" C:\ProCSharp\First.cs ";
但這種方式容易令人產(chǎn)生疑惑絮宁,因此C#提供了替代方式。即可以在字符串字面量的前面加上字符@服协,在這個(gè)字符后的所有字符都看成其原來(lái)的含義羞福。
string filePath=@" C:\ProCSharp\First.cs "
(2)字符的作用 對(duì)字符串加上前綴,就允許把花括號(hào)放在包含一個(gè)變量甚或代碼表達(dá)式的字符串中蚯涮。變量或代碼表達(dá)式的結(jié)果放在字符串中花括號(hào)所在的位置:

C#里面Debug和Release模式區(qū)別

release和debug是不同的運(yùn)行方式:
debug會(huì)增加調(diào)試代碼治专,方便調(diào)試卖陵。調(diào)試完后,用release版本發(fā)布张峰,沒(méi)有調(diào)試代碼泪蔫,減小程序體積,
加快執(zhí)行速度喘批!

C#里面字典和Hashtable

Dictionary

Dictionary:
必須包含名空間System.Collection.Generic
Dictionary里面的每一個(gè)元素都是一個(gè)鍵值對(duì)(由二個(gè)元素組成:鍵和值)
鍵必須是唯一的,而值不需要唯一的
鍵和值都可以是任何類型(比如:string, int, 自定義類型撩荣,等等)
通過(guò)一個(gè)鍵讀取一個(gè)值的時(shí)間是接近O(1)
鍵值對(duì)之間的偏序可以不定義

使用方法:

//定義
Dictionary<string, string> openWith = new Dictionary<string, string>();

//添加元素
openWith.Add("txt", "notepad.exe");
openWith.Add("bmp", "paint.exe");
openWith.Add("dib", "paint.exe");
openWith.Add("rtf", "wordpad.exe");

//取值
Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

//更改值
 openWith["rtf"] = "winword.exe";
 Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

 //遍歷key
  foreach (string key in openWith.Keys)
  {
        Console.WriteLine("Key = {0}", key);   //獲得key(鍵的值)
        
   }

   //遍歷value ,方法一
   foreach (string value in openWith.Values)   
   {
       Console.WriteLine("value = {0}", value);  
    }
     //方法二
    foreach (string key in openWith.Keys)
    {
        Console.WriteLine("Values={0}",openWith[key]);  //獲得key(鍵)的values(值)
    }

    //刪除元素
    openWith.Remove("doc");
    if (!openWith.ContainsKey("doc"))
    {
         Console.WriteLine("Key \"doc\" is not found.");
     }

     //判斷鍵存在
    if (openWith.ContainsKey("bmp")) // True 
    {
          Console.WriteLine("An element with Key = \"bmp\" exists.");
     }

常用屬性
名稱 說(shuō)明
Comparer 獲取用于確定字典中的鍵是否相等的 IEqualityComparer<T>。
Count 獲取包含在 Dictionary<TKey, TValue> 中的鍵/值對(duì)的數(shù)目饶深。
Item 獲取或設(shè)置與指定的鍵相關(guān)聯(lián)的值餐曹。
Keys 獲取包含 Dictionary<TKey, TValue> 中的鍵的集合。
Values 獲取包含 Dictionary<TKey, TValue> 中的值的集合敌厘。

常用方法
名稱 說(shuō)明
Add 將指定的鍵和值添加到字典中台猴。
Clear 從 Dictionary<TKey, TValue> 中移除所有的鍵和值。
ContainsKey 確定 Dictionary<TKey, TValue> 是否包含指定的鍵俱两。
ContainsValue 確定 Dictionary<TKey, TValue> 是否包含特定值饱狂。
Equals(Object) 確定指定的 Object 是否等于當(dāng)前的 Object。 (繼承自 Object宪彩。)
GetType 獲取當(dāng)前實(shí)例的 Type休讳。 (繼承自 Object。)
Remove 從 Dictionary<TKey, TValue> 中移除所指定的鍵的值尿孔。
ToString 返回表示當(dāng)前對(duì)象的字符串俊柔。 (繼承自 Object。)
TryGetValue 獲取與指定的鍵相關(guān)聯(lián)的值活合。

Hashtable

  1. 哈希表(HashTable)簡(jiǎn)述
    在.NET Framework中婆咸,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類似
    keyvalue的鍵值對(duì)芜辕,其中key通成薪荆可用來(lái)快速查找,同時(shí)key是區(qū)分大小寫侵续;value用于存儲(chǔ)對(duì)應(yīng)于key的值倔丈。
    Hashtable中keyvalue鍵值對(duì)均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對(duì).

  2. 什么情況下使用哈希表
    (1)某些數(shù)據(jù)會(huì)被高頻率查詢
    (2)數(shù)據(jù)量大
    (3)查詢字段包含字符串類型
    (4)數(shù)據(jù)類型不唯一

using System;
using System.Collections; //file使用Hashtable時(shí)状蜗,必須引入這個(gè)命名空間
class Program
{
public static void Main()
{
Hashtable ht = new Hashtable(); //創(chuàng)建一個(gè)Hashtable實(shí)例
ht.Add("北京", "帝都"); //添加keyvalue鍵值對(duì)
ht.Add("上海", "魔都");
ht.Add("廣州", "省會(huì)");
ht.Add("深圳", "特區(qū)");

 string capital = (string)ht["北京"];
 Console.WriteLine(capital)  //打印key="北京"的values值 結(jié)果:帝都
 Console.WriteLine(ht.Contains("上海")); //判斷哈希表是否包含特定鍵,其返回值為true或false
 ht.Remove("深圳"); //移除一個(gè)keyvalue鍵值對(duì)

 //遍歷values
foreach (string value in ht.Values)
{
        Console.WriteLine(value);
}

 ht.Clear(); //移除所有元素

}
}

Dictionary和Hashtable區(qū)別

HashTable和Dictionary的區(qū)別:
(1).HashTable不支持泛型需五,而Dictionary支持泛型。
(2). Hashtable 的元素屬于 Object 類型轧坎,所以在存儲(chǔ)或檢索值類型時(shí)通常發(fā)生裝箱和拆箱的操作宏邮,所以你可能
需要進(jìn)行一些類型轉(zhuǎn)換的操作,而且對(duì)于int,float這些值類型還需要進(jìn)行裝箱等操作,非常耗時(shí)蜜氨。
(3).單線程程序中推薦使用 Dictionary, 有泛型優(yōu)勢(shì), 且讀取速度較快, 容量利用更充分械筛。多線程程序中推薦使用
Hashtable, 默認(rèn)的 Hashtable 允許單線程寫入, 多線程讀取, 對(duì) Hashtable 進(jìn)一步調(diào)用 Synchronized() 方法可以
獲得完全線程安全的類型. 而 Dictionary 非線程安全, 必須人為使用 lock 語(yǔ)句進(jìn)行保護(hù), 效率大減。
(4)在通過(guò)代碼測(cè)試的時(shí)候發(fā)現(xiàn)key是整數(shù)型Dictionary的效率比Hashtable快飒炎,如果key是字符串型埋哟,Dictionary
的效率沒(méi)有Hashtable快。

C#里面set和get訪問(wèn)器

屬性的訪問(wèn)器包含與獲壤赏簟(讀取或計(jì)算)或設(shè)置(寫)屬性有關(guān)的可執(zhí)行語(yǔ)句赤赊。訪問(wèn)器聲明可以包含 get 訪問(wèn)器或 set 訪問(wèn)器,
或者兩者均包含煞赢。

get {}:get 訪問(wèn)器體與方法體相似抛计。它必須返回屬性類型的值。執(zhí)行 get 訪問(wèn)器相當(dāng)于讀取字段的值照筑。
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
}

set {}:set 訪問(wèn)器與返回 void 的方法類似吹截。它使用稱為 value 的隱式參數(shù),此參數(shù)的類型是屬性的類型朦肘。
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}

只帶有 get 訪問(wèn)器的屬性稱為只讀屬性。無(wú)法對(duì)只讀屬性賦值双饥。
只帶有 set 訪問(wèn)器的屬性稱為只寫屬性媒抠。只寫屬性除作為賦值的目標(biāo)外,無(wú)法對(duì)其進(jìn)行引用咏花。
同時(shí)帶有 get 和 set 訪問(wèn)器的屬性為讀寫屬性趴生。
在屬性聲明中,get 和 set 訪問(wèn)器都必須在屬性體的內(nèi)部聲明昏翰。

注意:使用get訪問(wèn)器更改對(duì)象的狀態(tài)是一種錯(cuò)誤的編程方式苍匆,盡量不要在get訪問(wèn)器中更改對(duì)象的狀態(tài)。
eg:
public int Number
{
get
{
return number++; // Don't do this
}
}

使用屬性方式訪問(wèn)屬性:
使用這種方式需要注意棚菊,同一屬性的get和set方法不能夠分開(kāi)定義浸踩。及name屬性的set和get方法都要放在
public string Name的屬性定義中,若有兩個(gè)public string Name編譯會(huì)報(bào)錯(cuò)统求。編譯器會(huì)認(rèn)為Student類定
義了兩個(gè)同名的屬性检碗,一個(gè)只讀一個(gè)只寫。

eg:
class Student
{
private string name;
private int number;
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Number
{
set
{
number = value;
}
get
{
return number;
}
}
}

set和get訪問(wèn)器的好處:1码邻、讀取設(shè)置分開(kāi)折剃,這樣代碼便于維護(hù),當(dāng)訪問(wèn)器中的某個(gè)字段需要添加新的判斷條件時(shí)候像屋,
只需要在訪問(wèn)器中添加判斷語(yǔ)句或者做條件修改怕犁,而無(wú)需給程序中所有該字段添加判斷和條件語(yǔ)句。

C#里面泛型

List<object> objlist=new List<object>() {}; object類型做數(shù)據(jù)轉(zhuǎn)換時(shí)候有拆裝箱操作,有性能損耗奏甫,建議少用戈轿。

泛型約束:定義泛型時(shí),可以對(duì)泛型類或泛型接口扶檐,方法能夠接收的類型參數(shù)的種類加以限制凶杖。在編譯階段,
如果使用不符合要求的類作為類型參數(shù)款筑,則會(huì)產(chǎn)生編譯錯(cuò)誤智蝠。

六種約束的格式說(shuō)明
where T:struct
class Stack<TElement> where TElement :struct
限制類型參數(shù)必須是值類型,并且不可以是可空值類型(例如int?,char?,double?,bool?等)

where T: class
class Stack<TElement> where TElement :class
限制類型參數(shù)必須是引用類型

where T:基類名
class Stack<TElement> where TElement :BaseClass
限制類型參數(shù)必須是繼承自指定的基類奈梳,或是基類本身

where T:接口名
class Stack<TElement> where TElement :IInterface
限制類型參數(shù)必須是實(shí)現(xiàn)指定接口杈湾,或是指定接口

where T:new()
class Stack<TElement> where TElement :new()
限制類型參數(shù)必須具有無(wú)參構(gòu)造函數(shù)
對(duì)new()解釋說(shuō)到是where字句的構(gòu)造函數(shù)約束,帶有new()約束的任何類型都必須有可訪問(wèn)的無(wú)參構(gòu)造函數(shù)攘须,
正常來(lái)說(shuō)C#創(chuàng)建的類默認(rèn)都有一個(gè)無(wú)參的構(gòu)造函數(shù)漆撞,即使你沒(méi)有寫,但是如果你寫了一個(gè)有參數(shù)的構(gòu)造函數(shù)后于宙,
那么就沒(méi)有默認(rèn)無(wú)參的那個(gè)了浮驳,就需要自己手動(dòng)寫一個(gè)。
其實(shí)說(shuō)的很明白捞魁,就是where字句后面有new()約束的話至会,該類中必須有公有的無(wú)參的構(gòu)造函數(shù)。
當(dāng)出現(xiàn)這種情況時(shí)候:
public static void show<T>(T t)where T:new() //這個(gè)約束表示T類型只接受帶一個(gè)無(wú)參構(gòu)造函數(shù)的類型對(duì)象

C#里面強(qiáng)類型和弱類型

強(qiáng)類型和弱類型的變量都有兩個(gè)屬性:類型和值谱俭。

強(qiáng)類型的變量類型是不能改變的奉件,弱類型的變量類型是隨需改變的,這是強(qiáng)弱的真正含義昆著。

#C#里面

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末县貌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凑懂,更是在濱河造成了極大的恐慌煤痕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件接谨,死亡現(xiàn)場(chǎng)離奇詭異杭攻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疤坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門兆解,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人跑揉,你說(shuō)我怎么就攤上這事锅睛〔壕蓿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵现拒,是天一觀的道長(zhǎng)辣垒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)印蔬,這世上最難降的妖魔是什么勋桶? 我笑而不...
    開(kāi)封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮侥猬,結(jié)果婚禮上例驹,老公的妹妹穿的比我還像新娘。我一直安慰自己退唠,他們只是感情好鹃锈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瞧预,像睡著了一般屎债。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垢油,一...
    開(kāi)封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天盆驹,我揣著相機(jī)與錄音,去河邊找鬼滩愁。 笑死躯喇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惊楼。 我是一名探鬼主播玖瘸,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秸讹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檀咙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起璃诀,我...
    開(kāi)封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弧可,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后劣欢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棕诵,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年凿将,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了校套。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牧抵,死狀恐怖笛匙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤荒给,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布庸队,位于F島的核電站,受9級(jí)特大地震影響蠢正,放射性物質(zhì)發(fā)生泄漏骇笔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一嚣崭、第九天 我趴在偏房一處隱蔽的房頂上張望笨触。 院中可真熱鬧,春花似錦有鹿、人聲如沸旭旭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)持寄。三九已至,卻和暖如春娱俺,著一層夾襖步出監(jiān)牢的瞬間稍味,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工荠卷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留模庐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓油宜,卻偏偏與公主長(zhǎng)得像掂碱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎冤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容