在C#中如何使用JSON
JSON簡(jiǎn)介
1. 什么是 JSON?
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。它的語(yǔ)法基于 JavaScript 對(duì)象表示法,簡(jiǎn)單、易讀,同時(shí)被許多編程語(yǔ)言支持。盡管它來(lái)源于 JavaScript,但它并不依賴(lài)于 JavaScript,許多語(yǔ)言(如 Python、Java、C#、PHP 等)都能夠解析和生成 JSON。
常見(jiàn)用途:
API 數(shù)據(jù)交互:在客戶端和服務(wù)器之間傳遞數(shù)據(jù)時(shí),JSON 是常用格式,特別是前后端交互時(shí).
配置文件:許多應(yīng)用程序使用 JSON 來(lái)保存配置文件(例如 .json 文件)。
數(shù)據(jù)持久化:在數(shù)據(jù)庫(kù)或文件系統(tǒng)中使用 JSON 來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。
2. JSON 的基本語(yǔ)法結(jié)構(gòu)
JSON 的數(shù)據(jù)結(jié)構(gòu)非常簡(jiǎn)單,主要包括以下兩種類(lèi)型:
對(duì)象(Object):由花括號(hào) {} 包圍的一組鍵值對(duì),鍵是字符串,值可以是任何合法的 JSON 數(shù)據(jù)類(lèi)型。
數(shù)組(Array):由方括號(hào) [] 包圍的一組值,值可以是任意 JSON 類(lèi)型。
示例:
{ "name": "John", "age": 30, "isStudent": false, "courses": ["Math", "Science"], "address": { "city": "New York", "zipcode": "10001" } }
JSON 的基本元素:
字符串:用雙引號(hào)包裹,如 "name": "John"
數(shù)字:可以是整數(shù)或浮點(diǎn)數(shù),如 "age": 30
布爾值:true 或 false
數(shù)組:一個(gè)有序的值列表,用方括號(hào) [] 包裹
對(duì)象:一個(gè)無(wú)序的鍵值對(duì)集合,用花括號(hào) {} 包裹
空值:null
你不難看出JSON 本質(zhì)上由三種主要元素構(gòu)成:
對(duì)象(Object):鍵值對(duì)的集合,類(lèi)似于字典。JSON 對(duì)象用 {} 表示,包含鍵值對(duì)(key-value pairs),鍵必須是字符串,值可以是任意合法的 JSON 元素(如數(shù)組、對(duì)象或基本值)。
數(shù)組(Array):有序的元素集合,類(lèi)似于列表或數(shù)組(不代表C#的數(shù)組,只是體現(xiàn)一個(gè)有序集合)。JSON 數(shù)組用 [] 表示,數(shù)組中的每個(gè)元素可以是任意合法的 JSON 元素(如對(duì)象、數(shù)組或基本值)。
基本值(Value):JSON 的最基礎(chǔ)元素,可以是字符串、數(shù)字、布爾值或 null。這部分?jǐn)?shù)據(jù)不能再包含其他子元素。
這很重要:因?yàn)槌浞址治鲞@三種元素自身以及他們之間的關(guān)系是JSON處理的關(guān)鍵.很多JSON庫(kù)也是考慮了這三種概念實(shí)現(xiàn)的.
3. JSON 的優(yōu)勢(shì)(作用)
JSON 之所以成為數(shù)據(jù)交換的首選格式,離不開(kāi)它的諸多優(yōu)勢(shì):
輕量級(jí):相比于 XML 等格式,JSON 占用的體積更小,結(jié)構(gòu)更為簡(jiǎn)潔。
可讀性好:人類(lèi)易讀,同時(shí)解析程序也易于編寫(xiě)。
支持?jǐn)?shù)據(jù)類(lèi)型豐富:可以直接表示對(duì)象、數(shù)組、字符串、數(shù)字、布爾值等常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)。
廣泛支持:幾乎所有編程語(yǔ)言都提供了用于解析和生成 JSON 的庫(kù)或內(nèi)置函數(shù)。
標(biāo)準(zhǔn)化格式:JSON 的格式有明確的標(biāo)準(zhǔn),確保了跨語(yǔ)言、跨平臺(tái)的兼容性。
靈活性高:可以嵌套任意復(fù)雜的對(duì)象和數(shù)組,適合復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
4. JSON 的常見(jiàn)使用場(chǎng)景
API 通信
在現(xiàn)代 Web 開(kāi)發(fā)中,前后端的通信常常依賴(lài)于 JSON。客戶端發(fā)送 HTTP 請(qǐng)求時(shí),通常使用 JSON 格式來(lái)傳遞數(shù)據(jù),服務(wù)器也通過(guò) JSON 格式返回?cái)?shù)據(jù)。下面是一個(gè)簡(jiǎn)單的例子:
請(qǐng)求體(客戶端向服務(wù)器發(fā)送的數(shù)據(jù)):
{ "username": "john_doe", "password": "123456" }
響應(yīng)體(服務(wù)器返回的數(shù)據(jù)):
{ "status": "success", "message": "Login successful", "token": "abcdef123456" }
配置文件
JSON 格式經(jīng)常用于存儲(chǔ)配置數(shù)據(jù),因?yàn)樗子陂喿x和修改。例如,一個(gè)應(yīng)用程序的配置文件可能如下:
{ "app_name": "MyApp", "version": "1.0.0", "settings": { "theme": "dark", "language": "en" } }
本地?cái)?shù)據(jù)存儲(chǔ)
前端開(kāi)發(fā)中,JSON 常被用來(lái)在本地存儲(chǔ)數(shù)據(jù)(如瀏覽器的 localStorage 或 sessionStorage)。
數(shù)據(jù)序列化
當(dāng)將對(duì)象或數(shù)據(jù)結(jié)構(gòu)保存到文件或數(shù)據(jù)庫(kù)時(shí),通常需要將其序列化為字符串格式,JSON 就是常用的序列化格式之一。
5.JSON和C#類(lèi)型之間的映射關(guān)系
在 C# 中,JSON 的基本元素與相應(yīng)的數(shù)據(jù)類(lèi)型有直接的對(duì)應(yīng)關(guān)系。
1. 字符串
JSON:字符串用雙引號(hào)包裹,表示文本數(shù)據(jù)。
示例:"name": "John"
C# 對(duì)應(yīng)類(lèi)型:string
在 C# 中,JSON 的字符串類(lèi)型直接映射為 string 類(lèi)型。
示例:
string name = "John";
2. 數(shù)字
JSON:數(shù)字可以是整數(shù)或浮點(diǎn)數(shù),表示數(shù)值類(lèi)型的數(shù)據(jù)。
示例:"age": 30
C# 對(duì)應(yīng)類(lèi)型:int、float、double
在 C# 中,整數(shù)可以映射為 int,浮點(diǎn)數(shù)可以映射為 float 或 double,根據(jù)具體需要選擇類(lèi)型。
示例:
int age = 30; float price = 29.99f; double pi = 3.14159;
3. 布爾值
JSON:布爾值表示為 true 或 false。
示例:"isStudent": false
C# 對(duì)應(yīng)類(lèi)型:bool
在 C# 中,布爾值映射為 bool 類(lèi)型。
示例:
bool isStudent = false;
4. 數(shù)組
JSON:數(shù)組是一個(gè)有序的值列表,用方括號(hào) [] 包裹,數(shù)組中的每個(gè)元素可以是任意 JSON 類(lèi)型。
示例:"courses": ["Math", "Science"]
C# 對(duì)應(yīng)類(lèi)型:List<T> 或數(shù)組 T[]
在 C# 中,JSON 數(shù)組可以映射為 List<T>(泛型列表)或者普通數(shù)組 T[],其中 T 是數(shù)組中元素的類(lèi)型。
示例:
List<string> courses = new List<string> { "Math", "Science" }; // 或者 string[] coursesArray = { "Math", "Science" };
5. 對(duì)象
JSON:對(duì)象是一個(gè)無(wú)序的鍵值對(duì)集合,用花括號(hào) {} 包裹,每個(gè)鍵必須是字符串,值可以是任意 JSON 類(lèi)型。
示例:"address": { "city": "New York", "zipcode": "10001" }
C# 對(duì)應(yīng)類(lèi)型:自定義類(lèi)或 Dictionary<string, T>
在 C# 中,JSON 對(duì)象可以映射為自定義類(lèi),類(lèi)中的屬性對(duì)應(yīng) JSON 對(duì)象中的鍵值對(duì)。也可以使用 Dictionary<string, T> 來(lái)表示鍵值對(duì)集合,其中 T 表示值的類(lèi)型。
示例(使用自定義類(lèi)):
class Address { public string City { get; set; } public string Zipcode { get; set; } } Address address = new Address { City = "New York", Zipcode = "10001" };
示例(使用字典):
Dictionary<string, string> address = new Dictionary<string, string> { { "city", "New York" }, { "zipcode", "10001" } };
6. 空值
JSON:空值表示為 null。
示例:"middleName": null
C# 對(duì)應(yīng)類(lèi)型:null
在 C# 中,JSON 的 null 對(duì)應(yīng) C# 中的 null 值。它可以應(yīng)用于任何可空類(lèi)型(如引用類(lèi)型和 Nullable<T>)。
在 C# 中,JSON 的基本元素可以映射為相應(yīng)的 C# 數(shù)據(jù)類(lèi)型。這種映射使得我們可以輕松處理 JSON 數(shù)據(jù),并與 C# 中的對(duì)象和類(lèi)型進(jìn)行交互。
6. 如何處理 JSON 數(shù)據(jù)
什么是序列化/反序列化
我們首先要先鋪墊一下什么是序列化/反序列化
序列化和反序列化是將對(duì)象和數(shù)據(jù)在不同格式之間轉(zhuǎn)換的過(guò)程,主要用于數(shù)據(jù)持久化、網(wǎng)絡(luò)傳輸?shù)葓?chǎng)景.在C#中我們的數(shù)據(jù)一般以對(duì)象形式存儲(chǔ)在內(nèi)存中,但是內(nèi)存數(shù)據(jù)不能持久保存,你關(guān)機(jī)后或者程序關(guān)閉時(shí)數(shù)據(jù)就沒(méi)了,那我們?cè)趺窗褦?shù)據(jù)保存下來(lái)呢?
答案就是序列化,我們常用的就是將對(duì)象序列化為JSON(當(dāng)然不止JSON,只是JSON更常用),這樣我們?cè)賹⑵?這個(gè)其說(shuō)的更清晰點(diǎn)就是字符串,JSON絕大多數(shù)情況是以字符串形式出現(xiàn)的,只不過(guò)你可以理解為是一種有一定格式或一定規(guī)則的字符串)保存在磁盤(pán)或者通過(guò)網(wǎng)絡(luò)傳遞給其他人都很方便.
理所當(dāng)然的JSON轉(zhuǎn)換為內(nèi)存中的對(duì)象就是反序列化,常見(jiàn)的情景就是讀取JSON格式的配置文件,先從磁盤(pán)讀取出來(lái)再反序列化為對(duì)象,我們就可以十分方便的操作這個(gè)對(duì)象了.
怎么做?
大多數(shù)編程語(yǔ)言都提供了用于解析(反序列化)和生成(序列化)JSON 數(shù)據(jù)的庫(kù)或內(nèi)置函數(shù)。
C# 提供了 System.Text.Json 和 Newtonsoft.Json(第三方庫(kù))來(lái)處理 JSON。
我建議使用Newtonsoft.Json(NuGet Gallery | Newtonsoft.Json 13.0.3),這可以說(shuō)是C#環(huán)境里最流行,最強(qiáng)大的一個(gè)庫(kù),經(jīng)過(guò)二十年左右的發(fā)展支持絕大多數(shù).net環(huán)境,目前在所有nuget包中下載量中排名第一.
常見(jiàn)用法
1. 使用 JsonConvert.SerializeObject 方法可以將 C# 對(duì)象轉(zhuǎn)換為 JSON 字符串。
using Newtonsoft.Json; public class Person { public string Name { get; set; } public int Age { get; set; } public bool IsStudent { get; set; } } Person person = new Person { Name = "John", Age = 30, IsStudent = false }; // 序列化為 JSON string json = JsonConvert.SerializeObject(person); Console.WriteLine(json);
得到(這就是一個(gè)字符串,包括首尾的花括號(hào)在內(nèi),前面提到{}代表一個(gè)對(duì)象,里面是無(wú)序的鍵值對(duì))
{"Name":"John","Age":30,"IsStudent":false}
2. 使用 JsonConvert.DeserializeObject<T> 可以將 JSON 字符串反序列化為 C# 對(duì)象。
//這里的\是轉(zhuǎn)義符,不是字符串自身的內(nèi)容 string json = "{\"Name\":\"John\",\"Age\":30,\"IsStudent\":false}"; // 反序列化為對(duì)象 Person person = JsonConvert.DeserializeObject<Person>(json); Console.WriteLine(person.Name); // 輸出 "John" Console.WriteLine(person.Age); // 輸出 30
3. 將 JSON 數(shù)組轉(zhuǎn)換為 C# 集合(如 List<T>)。
string jsonArray = "[{\"Name\":\"John\",\"Age\":30},{\"Name\":\"Jane\",\"Age\":25}]"; // 反序列化為 List<Person> List<Person> people = JsonConvert.DeserializeObject<List<Person>>(jsonArray); foreach (var person in people) { Console.WriteLine($"{person.Name}, {person.Age}"); }
John, 30
Jane, 25
4. 處理嵌套對(duì)象
如果 JSON 中包含嵌套對(duì)象,Newtonsoft.Json 可以自動(dòng)反序列化嵌套結(jié)構(gòu)。
public class Address { public string City { get; set; } public string Zipcode { get; set; } } public class Person { public string Name { get; set; } public Address Address { get; set; } } string nestedJson = "{\"Name\":\"John\",\"Address\":{\"City\":\"New York\",\"Zipcode\":\"10001\"}}"; // 反序列化嵌套的 JSON Person person = JsonConvert.DeserializeObject<Person>(nestedJson); Console.WriteLine($"{person.Name} lives in {person.Address.City}, {person.Address.Zipcode}");
5.JToken,JObject,JArray,JValue
上面提到JSON的基本組成元素:對(duì)象,數(shù)組,基本值,這對(duì)應(yīng)看newtonjson提供的JObject,JArray,JValue三種類(lèi)型,哪還有一個(gè)JToken,這個(gè)JToken是三種類(lèi)型抽象類(lèi)型,后三者繼承自前者.
為什么提到這些類(lèi)呢?因?yàn)楦`活!
你注意上面例子,我們處理一個(gè)JSON需要先聲明一個(gè)類(lèi)型,有的時(shí)候我們聲明了這個(gè)類(lèi)型可能極少使用,那么這個(gè)時(shí)候我們聲明一個(gè)類(lèi)型似乎就有些沒(méi)必要了.
或者這個(gè)JSON數(shù)據(jù)的結(jié)構(gòu)不是固定的,或是動(dòng)態(tài)的的情況下.所以我們使用上面的類(lèi)型.
string jsonString = "{\"name\": \"Alice\", \"age\": 25}"; // 使用 JObject 解析 JObject obj = JObject.Parse(jsonString); // 動(dòng)態(tài)訪問(wèn)字段 string name = (string)obj["name"]; int age = (int)obj["age"]; Console.WriteLine($"Name: {name}, Age: {age}");
請(qǐng)看JSON代表一個(gè)對(duì)象,如果不常用這個(gè)類(lèi)型,那么我們直接認(rèn)為它是一個(gè)JObject類(lèi)型.這樣我們轉(zhuǎn)為JObject類(lèi)型,再使用索引器直接拿到我們需要的數(shù)據(jù).
上述我們知道這是一個(gè)對(duì)象,所以我們使用JObject類(lèi)型,那么我們連這個(gè)也不知道呢?無(wú)妨!掏出我們的JToken類(lèi)型,這個(gè)類(lèi)型是三個(gè)子類(lèi)的父類(lèi),包含所有子類(lèi)的行為,能夠代表所有的JSON概念,無(wú)論它是對(duì)象,數(shù)組,還是基本值.
using Newtonsoft.Json.Linq; string jsonString = @"{ 'person': { 'name': 'Alice', 'age': 25, 'address': { 'city': 'Wonderland', 'zipcode': '12345' }, 'phones': ['123-456-7890', '987-654-3210'] } }"; // 解析為 JToken JToken token = JToken.Parse(jsonString); // 動(dòng)態(tài)訪問(wèn)嵌套字段 string name = (string)token["person"]["name"]; string city = (string)token["person"]["address"]["city"]; string phone = (string)token["person"]["phones"][0]; Console.WriteLine($"Name: {name}, City: {city}, First Phone: {phone}");
using Newtonsoft.Json.Linq; string jsonString = @"{ 'name': 'Alice', 'age': 25, 'address': { 'city': 'Wonderland', 'zipcode': '12345' }, 'hobbies': ['reading', 'chess', 'running'] }"; // 使用 JToken 解析 JToken token = JToken.Parse(jsonString); // 動(dòng)態(tài)訪問(wèn)對(duì)象中的字段 string name = (string)token["name"]; int age = (int)token["age"]; // 動(dòng)態(tài)訪問(wèn)嵌套對(duì)象 string city = (string)token["address"]["city"]; string zipcode = (string)token["address"]["zipcode"]; // 動(dòng)態(tài)訪問(wèn)數(shù)組中的元素 string firstHobby = (string)token["hobbies"][0]; string secondHobby = (string)token["hobbies"][1]; // 輸出結(jié)果 Console.WriteLine($"Name: {name}, Age: {age}"); Console.WriteLine($"City: {city}, Zipcode: {zipcode}"); Console.WriteLine($"First Hobby: {firstHobby}, Second Hobby: {secondHobby}");
類(lèi)型轉(zhuǎn)換(對(duì)于JToken或它的子類(lèi))
Newtonsoft.Json 不僅支持通過(guò)類(lèi)型強(qiáng)制轉(zhuǎn)換訪問(wèn) JSON 數(shù)據(jù),還提供了更加便捷的方法來(lái)進(jìn)行類(lèi)型轉(zhuǎn)換。這些方法能夠避免類(lèi)型強(qiáng)制轉(zhuǎn)換時(shí)潛在的異常風(fēng)險(xiǎn),并提供更清晰的代碼表達(dá)。
Newtonsoft.Json 提供了以下常用的類(lèi)型轉(zhuǎn)換方法
1.Value<T>() 方法(適用于基本類(lèi)型)
Value<T>() 是 JToken 提供的一個(gè)泛型方法,能夠安全地將 JToken 的值轉(zhuǎn)換為指定的類(lèi)型。如果類(lèi)型轉(zhuǎn)換失敗,它不會(huì)拋出異常,而是返回類(lèi)型的默認(rèn)值。
適用于想要避免顯式的類(lèi)型強(qiáng)制轉(zhuǎn)換,并且希望代碼更簡(jiǎn)潔、安全的場(chǎng)景。
JToken token = JToken.Parse(@"{ 'name': 'Alice', 'age': 25 }"); string name = token["name"].Value<string>(); // 安全的類(lèi)型轉(zhuǎn)換 int age = token["age"].Value<int>(); // 轉(zhuǎn)換為 int Console.WriteLine($"Name: {name}, Age: {age}");
使用 Value<T>() 進(jìn)行轉(zhuǎn)換時(shí),如果值不存在或者轉(zhuǎn)換失敗,它會(huì)返回類(lèi)型的默認(rèn)值(如 string 會(huì)返回 null,int 會(huì)返回 0),不會(huì)像類(lèi)型強(qiáng)制轉(zhuǎn)換那樣拋出異常。
2.ToObject<T>() 方法
ToObject<T>() 是另一個(gè)常用的方法,允許將 JToken 轉(zhuǎn)換為一個(gè)具體的對(duì)象或類(lèi)型。它適用于你希望將 JSON 數(shù)據(jù)反序列化為 C# 的具體類(lèi)型(如類(lèi)或結(jié)構(gòu)體)的場(chǎng)景。
ToObject<T>() 方法通過(guò)反序列化來(lái)進(jìn)行轉(zhuǎn)換,因此適合用于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換。
// 定義一個(gè)類(lèi)與 JSON 數(shù)據(jù)對(duì)應(yīng) public class Person { public string Name { get; set; } public int Age { get; set; } } JToken token = JToken.Parse(@"{ 'name': 'Alice', 'age': 25 }"); // 將 JToken 反序列化為具體的 Person 對(duì)象 Person person = token.ToObject<Person>(); Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
適合處理復(fù)雜的 JSON 數(shù)據(jù)結(jié)構(gòu),能夠?qū)⒄麄€(gè) JSON 結(jié)構(gòu)直接轉(zhuǎn)換為一個(gè) C# 對(duì)象。
它的靈活性使得你可以輕松地從 JSON 數(shù)據(jù)中創(chuàng)建 C# 類(lèi)對(duì)象,而不用手動(dòng)提取每一個(gè)字段。
3.TryGetValue<T>(out T result) 方法
這是一個(gè)較為安全的訪問(wèn)方式,TryGetValue 嘗試從 JToken 中獲取指定類(lèi)型的值,并通過(guò)返回布爾值來(lái)指示是否成功獲取。
它適合在不確定 JSON 數(shù)據(jù)結(jié)構(gòu)或類(lèi)型時(shí),安全地進(jìn)行轉(zhuǎn)換操作,避免拋出異常。
JToken token = JToken.Parse(@"{ 'name': 'Alice', 'age': 'not an integer' }"); // 嘗試安全獲取值 int age; bool success = token["age"].TryGetValue<int>(out age); if (success) { Console.WriteLine($"Age: {age}"); } else { Console.WriteLine("Failed to get a valid integer for age."); }
安全的類(lèi)型轉(zhuǎn)換方式,適合在 JSON 數(shù)據(jù)不可靠或結(jié)構(gòu)復(fù)雜時(shí)使用。
它通過(guò) out 參數(shù)來(lái)返回結(jié)果,能夠避免異常。
強(qiáng)制類(lèi)型轉(zhuǎn)換 vs 提供的方法
強(qiáng)制類(lèi)型轉(zhuǎn)換(Explicit Casting)
允許直接進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,比如 (string)token["name"] 或 (int)token["age"]。這種方式比較簡(jiǎn)潔,但是如果類(lèi)型不匹配或值不存在,會(huì)拋出異常。
總結(jié)
Value<T>() 方法:提供了安全的類(lèi)型轉(zhuǎn)換方式,不會(huì)拋出異常,適合處理簡(jiǎn)單的數(shù)據(jù)訪問(wèn)場(chǎng)景,代碼簡(jiǎn)潔。
ToObject<T>() 方法:適合將 JSON 直接轉(zhuǎn)換為 C# 對(duì)象,特別是對(duì)于復(fù)雜的 JSON 結(jié)構(gòu),能夠減少手動(dòng)提取每個(gè)字段的工作量。
TryGetValue<T>() 方法:提供一種安全的方式來(lái)獲取 JSON 數(shù)據(jù)中的值,適合在不確定數(shù)據(jù)結(jié)構(gòu)或類(lèi)型的情況下使用,防止異常的發(fā)生。
到此這篇關(guān)于在C#中使用JSON的文章就介紹到這了,更多相關(guān)C#使用JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C#無(wú)損高質(zhì)量壓縮圖片實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C#無(wú)損高質(zhì)量壓縮圖片的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05C#通過(guò)XML節(jié)點(diǎn)屬性/屬性值讀取寫(xiě)入XML操作代碼實(shí)例
本文主要介紹C#通過(guò)XML節(jié)點(diǎn)屬性、屬性值對(duì)XML的讀取,寫(xiě)入操作,大家參考使用吧2013-11-11C#中數(shù)據(jù)類(lèi)型的轉(zhuǎn)換介紹
大家好,本篇文章主要講的是C#中數(shù)據(jù)類(lèi)型的轉(zhuǎn)換介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01C#實(shí)現(xiàn)仿QQ抽屜式窗體的設(shè)計(jì)方法
QQ軟件對(duì)于絕大多數(shù)的人來(lái)說(shuō)再熟悉不過(guò)了,它以使用方便、界面美觀及功能完善而著稱(chēng),本文給大家介紹了C#實(shí)現(xiàn)仿QQ抽屜式窗體的設(shè)計(jì)方法,主要通過(guò)使用API函數(shù)WindowFromPoint和GetParent實(shí)現(xiàn)仿QQ的抽屜式窗體,需要的朋友可以參考下2024-04-04C# 開(kāi)發(fā)圓角控件(窗體)的具體實(shí)現(xiàn)
這篇文章主要介紹了C# 開(kāi)發(fā)圓角控件的具體實(shí)現(xiàn),需要的朋友可以參考下2014-02-02VSCode配置C#運(yùn)行環(huán)境的完整步驟
這篇文章主要給大家介紹了關(guān)于VSCode配置C#運(yùn)行環(huán)境的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09