那些年我們追過的C#奇葩關鍵字——忐忑


說到中國的歌壇,不能光說張學友這種大咖吧,我看那些怪咖更給力,比如我們的龔琳娜童鞋,一首神曲《忐忑》唱的那叫不可收拾,而且聽到的改編版本更多,每一次都是心懷忐忑,就像C#里的那些關鍵字

說到這些關鍵字,我不得不說它們高端大氣上檔次,它們只會偶爾出現,所以你也可以說它們低調奢華有內涵,但絕對是程序猿之必備神器,無論是面試,還是開發、、、

那就認識認識吧,可是又太多,所以也只能是想到哪里是哪里,我們這就讓思緒自由飛翔一會吧!

1、@

這個東東看似和郵件有關啊,但是在C#的世界里,可跟郵件沒有一毛錢關系,它是string的女朋友(當然了string有N多女友),二者結合就可以發揮作用了。你可以給它起個名字,叫做“逐字字符串”,或者別的什么東東都行,這都不重要,關鍵你要會泡它~

在處理字符串時,那些個字符串轉義字符我們可傷不起,一個個的記又記不住,用了還要查,麻煩的不行,那@就是為解決這個而誕生的,直接讓字符串原樣輸出有木有?什么sql字符串了,還有路徑啥了的,統統搞定

string sql = @"select * from student where id = '001'";
//實際sql輸出select * from student where id = '001'
string path = @"C:\MDocu\student.xml";
//實際path輸出C:\MDocu\student.xml,注意這里可不是\\哦

如果字符串里邊包含雙引號時,要稍微處理一下,那就是在雙引號的外邊再加雙引號即可

string s = @"He said,""yes""";
//s輸出He said,"yes"

2、is

目的就一個,檢查變量是不是給定的類型,是就返回true,不是就false了,比較簡單,一筆帶過了

int i = 5;
bool check = i is int;//check = true

3、as

用於在兼容的引用類型之間執行轉換。例如

string s = someObject as string;
if (s != null)
{
    // someObject is a string.
}

as運算符類似於強制轉換操作;但是,如果轉換不可行,as會返回null而不是引發異常。更嚴格地說,這種形式的表達式 等效於

expression is type ? (type)expression : (type) null

as 運算符只執行引用轉換和裝箱轉換。as運算符無法執行其他轉換,如用戶定義的轉換,這類轉換應使用cast表達式來執行。

4、sizeof

用於獲取非托管類型的大小(以字節為單位)

int intSize = sizeofint);//intSize = 4

5、typeof

返回Type對象,該對象保存類型信息

Type myType = typeofint);
console.writeline("Type:{}",myType);
//輸出Type:System.Int32

6、checked

檢測操作的溢出情況

short a =20000,b=20000;
short myShort = checked((short)(a+b));
//error

7、unchecked

忽略溢出關鍵字,接受結果而不管溢出情況,默認是不檢查溢出的

short a =20000,b=20000;
short myShort = checked((short)(a+b));
//忽略error

8、Guid

全局唯一標示符,是一個128位的字符串,在任何要以唯一方式來表示某個事物時就可以用該屌絲。

uniquecode = Guid.NewGuid ();
console.WriteLine("myCode:{}",uniquecode.ToString());
//輸出:myCode:cabfe0ba-fa72-4c5c-969f-e76821949ff1

9、?

可空類型

public class student
{
     private string name;
     private int? age=null;
     public string Name
     {
         get { return name; }
         set { name = value; }
     }
     public int? Age
     {
         get { return age; }
         set { age = value; }
     }
}
student s = new student();
s.Age = null;//是允許的

10、??

null接合操作符,也可以說是雙問號操作符,意思是取所賦值??左邊的,如果左邊為null,取所賦值??右邊的

DateTime? createDate = null;
DateTime? defaultDate= null;
DateTime secondDate = DateTime.Now;
createDate = createDate ??defaultDate??secondDate;

// 如果createDate 為空,則對defaultDate求值,如果defaultDate不為空,則將defaultDate賦值給createDate 。否則繼續計算secondDate,是不是null都賦值給createDate ,因為是最后一個表達式

11、::

這個東東比較少見,你可以叫它雙冒號運算符,這個在給命名空間起別名的時候能用到

在此示例中,命名空間 System 用於包括類 TestClass,因此必須使用 global::System.Console 來引用 System.Console 類,該類被 System 命名空間隱藏。 而且,別名 colAlias 用於引用命名空間 System.Collections;因此,將使用此別名而不是命名空間來創建 System.Collections.Hashtable 的實例。

using colAlias = System.Collections;
namespace System
{
    class TestClass
    {
        static void Main()
        {
            // Searching the alias:
            colAlias::Hashtable test = new colAlias::Hashtable();

            // Add items to the table.
            test.Add("A", "1");
            test.Add("B", "2");
            test.Add("C", "3");

            foreach (string name in test.Keys)
            {
                // Searching the global namespace:
                global::System.Console.WriteLine(name + " " + test[name]);
            }
        }
    }
}

12、=>

Lambda表達式的運算符是=>,運算符左邊列舉出了需要的參數,右邊定義了賦予Lambda變量的方法的實現代碼

List<User> user = new List<User>{ new User{Id=1,Name="LiSi",Age=22},  new User{Id=2,Name="ZhangSan",Age=25} }; 
//獲取特定人時所用的過濾條件,p參數屬於User類型  
var results = user.Where(p => p.Name == "LiSi").ToList();  //用User對象的Age值計算平均年齡  
var average = user.Average(p => p.Age); 

13、ref

 ref 關鍵字使參數按引用傳遞,也就是說它能夠讓你直接對原數進行操作,而不是對那個原數的Copy進行操作。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字,而且傳遞到 ref 參數的參數必須最先初始化,例如:

class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val); // val is now 44    
}
}

14、out

out是傳出參數,與ref有點像,但偏重於輸出,而且不用初始化,通過執行使用out參數的方法邏輯,out后面的數接受並返回這個值,比如你寫一個方法返回dataset,同時你還想返回頁數,怎么辦?方法一般不能返回多個值啊,這個時候out就可以返回多個值,是不是很爽,你需要多個值得時候別忘了out這廝啊

public DataSet getData(out int count) 
{ 
    dataset ds=bll.getdata(10,20); 
獲取第11條到第20條數據,但是不可能只顯示共有10條記錄吧,那么我們就可以用out了 
    int rcount=bll.GetCount();//比方說這個是取總記錄數的
    count=rcount; 

    return ds; 
} 

//顯示的時候 

public void showdata() 
{ 
    int count=0; 

    gridview1.datasource=getData(out count); 
    gridview1.databind(); 
   label1.text="共有"+count.tostring()+"條記錄"; 
} 

15、params

params主要的用處是在給函數傳參數的時候用,就是當函數的參數不固定的時候。在方法聲明中的 params 關鍵字之后不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字!

注意事項:

(1)若形參表中含一個參數數組,則該參數數組必須位於形參列表的最后;

(2)參數數組必須是一維數組;

(3)不允許將params修飾符與ref和out修飾符組合起來使用;

(4)與參數數組對應的實參可以是同一類型的數組名,也可以是任意多個與該數組的元素屬於同一類型的變量;

(5)若實參是數組則按引用傳遞,若實參是變量或表達式則按值傳遞。

(6)用法:可變的方法參數,也稱數組型參數,適合於方法的參數個數不知的情況,用於傳遞大量的數組集合參數;當使用數組參數時,可通過使用params關鍵字在形參表中指定多種方法參數,並在方法的參數表中指定一個數組,形式為:方法修飾符 返回類型 方法名(params 類型[] 變量名)

如帶有參數的SQL 語句,不同的表的字段數量也不同,當你更新修改的時候就可以用params

 16、using

這個再也熟悉不過了,常見三種用法

(1)引用命名空間,例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

(2)創建別名(類或者命名空間的別名)

using MyControle=System.Console;
class UsingEx
{
   public static void Main()
   {
    MyConsole.WriteLine("應用了類的別名");
    }
}

(3)自動清理資源

using (SqlConnection conn = new SqlConnection(_connstr))
//這樣你就不用手工清理連接資源了

17、this

(1)表示當前實例

(2)索引器關鍵字

(3)隱藏父類同名方法的關鍵字

(4)擴展方法的關鍵字

也沒什么難的,多用用就會了

那些年我們追過的奇葩關鍵字遠不止這些,真是浪花一朵朵,我也只是想到了這些,真碰到沒見過的,查查也就知道了,沒必要糾結,想必看完了這篇大家依然很忐忑,其實也不是壞事,呵呵,說明咱們的求知欲很強烈啊,我也只能說繼續忐忑,繼續加油,最后依然忐忑,因為你在忐別的忑啊~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM