日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中双问号、双冒号等几个特殊关键字

發布時間:2023/12/10 C# 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中双问号、双冒号等几个特殊关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

@:放在字符串的前面,直接讓字符串原樣輸出。常用于:sql語句、路徑等

string sql = @"select * from tablename where id = '1'"; string path = @"C:\filename.xml";
如果字符串里邊包含雙引號時,需要兩個雙引號代表一個雙引號
string s = @"He said,""yes"""; //s輸出He said,"yes"

is:檢查變量是不是給定的類型,是返回true,不是返回false,特點是不會觸發異常

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

as:用于在兼容的引用類型之間執行轉換,轉換失敗則返回 Null,因此在使用前,需進行判空操作。例如

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表達式來執行。

sizeof:用于獲取數值類型的大小(單位為字節)

int intSize = sizeof(int);//intSize = 4

typeof:返回Type對象,該對象保存類型信息,參數為一個 類

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

checked:檢測操作的溢出情況

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

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

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

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

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

?:可空類型,主要是兼容數據庫字段的可空。數據庫中所有類型的字段均可以為空

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;//是允許的

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

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

:: 作用域操作符

兩個冒號表示作用域操作符。::操作符在其左操作數的作用域內找到其右操作數的名字。用于訪問某個命名空間中的名字,如std::cout,表明名字cout來自命名空間std。同樣的可以用來從某個類取名字,如string::size_type,表明size_type是string類定義的。這里面::前面是GAC的標示符global,用法比較特殊,和.不是一個類型的東西。global 是 C# 2.0 中新增的關鍵字,理論上說,如果代碼寫得好的話,根本不需要用到它。 假設你現在寫了一個類,名字叫 System。那么當你再在代碼里寫 System 的時候,編譯器就不知道你是要指你寫的 System 類還是系統的 System 命名空間,而 System 命名空間已經是根命名空間了,無法再通過完全限名來指定。在以前的 C# 版本中,這就是一個無法解決的問題。現在,可以通過
global::System
來表示 System 根命名空間,而用你自己的 MyNamespace.System 來表示自己的類。

另外,也可以用在命名空間別名上(也可以用 . 點號)在此示例中,命名空間 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 = new List{ 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)擴展方法的關鍵字

18、<%= %>主要用于在前臺輸入后臺變量,比如后臺中有個public string a = “abc”;前臺aspx頁面<%=a%>就可以取到后臺中a的值:abc

19、<%: %>是在asp.net mvc項目中綁ViewData用的,而且前提是視圖引擎用的是aspx的才行

20、__makeref、__reftype、__refvalue、__arglist 這類關鍵字才叫奇葩

看IL指令到mkrefany, 文檔中說它的作用是: “push a typed reference on the stack”, 不知道在C#的何種語法會用上這條指令, 于是Google之, 發現了從來沒有看過的C#關鍵字:

Object obj = new Object();

TypedReference typedref = __makeref(obj);

Type type = __reftype(typedref);

Object sameObj = __refvalue( typedref,Object);

對應的IL是:

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 33 (0x21)
.maxstack 1
.locals init ([0] object obj,
[1] typedref ‘typedref’,
[2] class [mscorlib]System.Type ‘type’,
[3] object sameObj)
IL_0000: nop
IL_0001: newobj instance void [mscorlib]System.Object::.ctor()
IL_0006: stloc.0
IL_0007: ldloca.s obj
IL_0009: mkrefany [mscorlib]System.Object
IL_000e: stloc.1
IL_000f: ldloc.1
IL_0010: refanytype
IL_0012: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_0017: stloc.2
IL_0018: ldloc.1
IL_0019: refanyval [mscorlib]System.Object
IL_001e: ldind.ref
IL_001f: stloc.3
IL_0020: ret
} // end of method Program::Main

可以發現:

TypedReference對象在IL中是typedref類型;

IL_0009使用mkrefany生成了一個類型為Object的typedref;

IL_0010使用refanytype從typedref中得到了一個RuntimeTypeHandle, 隨即調用一個方法得到Type對象;

IL_0019使用refanyval從typedref中獲取了一個類型為Object的引用, 從后面一句ldind.ref可以知道refanyval壓棧的是一個managed pointer(&類型), 而不是普通的reference, ldind.ref把棧頂的managed pointer轉換成了普通的reference.

這三個操作對應的也可以直接用TypedReference的靜態方法實現:

MyObj obj = new MyObj(99);

TypedReference tr = __makeref(obj); // TypedReference.MakeTypedReference

Type type = Type.GetTypeFromHandle(TypedReference.TargetTypeToken(tr));

MyObj sameObj = (MyObj)TypedReference.ToObject(tr);

在C#的unsafe語境中可以使用&運算符獲取一個值類型量/對象的地址, 但不可以獲取一個引用類型對象的地址, 因為引用類型字段值的分配完全受運行時控制, 但TypedReference可以看成為任何托管對象的指針, typeref在CLI里存在的理由是給所謂的動態語言提供一種動態的方式來訪問對象.

21、__arglist
大家都知道printf是一個不定參數數量的函數, 它的第二個參數是用…聲明的, 如果要在C#中使用P/Invoke應用這個函數該如何聲明呢? params是.NET中特有的不定參數數量的實現, 但我用

extern static int printf(string format, params object[] args);

聲明的printf永遠都不能正常工作(誰能?), 還好C#提供了一個__arglist關鍵字來支持古老的vararg, 如何使用__arglist聲明和調用printf見下面的代碼:

[DllImport(“msvcrt.dll”)]

extern static int printf(string format, __arglist);

static unsafe void Main(string[] args)

{

printf("%d %.2f %s", __arglist(3, 0.4567, "asdf"));

}

我們甚至可以自己寫一個帶vararg參數的方法, TypedReference也派上用場了:

static void MyPrint(__arglist)

{

ArgIterator itr = new ArgIterator(__arglist);while (itr.GetRemainingCount() > 0){Console.WriteLine(TypedReference.ToObject(itr.GetNextArg()));}

}

static unsafe void Main(string[] args)

{

MyPrint(__arglist("asdfasdf", 2, 1.2f, 2.4d, 123L, new object()));

總結

以上是生活随笔為你收集整理的C#中双问号、双冒号等几个特殊关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。