最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#常用類庫Google.Protobuf的使用小結(jié)

 更新時間:2026年05月08日 10:24:20   作者:阿蒙Armon  
Google.Protobuf作為谷歌推出的高效序列化框架,成為C#開發(fā)者實現(xiàn)高效數(shù)據(jù)傳輸與存儲的首選類庫,本文主要介紹了C#常用類庫Google.Protobuf的使用小結(jié),感興趣的可以了解一下

在C#分布式系統(tǒng)、微服務(wù)通信、跨語言交互場景中,數(shù)據(jù)序列化是核心環(huán)節(jié)。傳統(tǒng)序列化方式(如JSON、XML)存在性能瓶頸、數(shù)據(jù)冗余、跨語言兼容性差等痛點,而Google.Protobuf(Protocol Buffers,簡稱Protobuf)作為谷歌推出的高效序列化框架,以“緊湊二進制、跨語言、高性能、可擴展”為核心優(yōu)勢,成為C#開發(fā)者實現(xiàn)高效數(shù)據(jù)傳輸與存儲的首選類庫,廣泛應(yīng)用于微服務(wù)、物聯(lián)網(wǎng)、RPC通信等場景。

本文聚焦“簡練、詳細、有深度”,摒棄冗余理論,從核心價值、環(huán)境搭建、proto文件定義、序列化/反序列化、進階特性到實戰(zhàn)落地,全方位解析Google.Protobuf for C#的用法,幫你快速掌握其精髓,解決實際開發(fā)中的序列化與跨語言通信痛點。

一、核心定位:Google.Protobuf解決什么問題?

Google.Protobuf的核心是“高效二進制序列化框架”,區(qū)別于JSON、XML等文本序列化方式,它通過預(yù)定義的協(xié)議格式(.proto文件),將數(shù)據(jù)編譯為二進制格式,核心解決傳統(tǒng)序列化的3大痛點:

  • 性能低下:二進制格式體積遠小于JSON/XML,序列化/反序列化速度提升5-10倍,降低網(wǎng)絡(luò)傳輸帶寬與存儲成本。
  • 跨語言兼容差:支持Java、Python、Go、C++等多語言,一份proto定義,多語言共用,徹底解決跨語言通信的數(shù)據(jù)格式不一致問題。
  • 可擴展性差:支持字段新增、廢棄,無需修改舊版本代碼,保證向后兼容,適配業(yè)務(wù)迭代過程中的數(shù)據(jù)結(jié)構(gòu)變更。

核心優(yōu)勢:體積小、速度快、跨語言、可擴展、類型安全,無冗余依賴,無縫集成C#各類項目(控制臺、ASP.NET Core、微服務(wù)),是分布式系統(tǒng)通信的“數(shù)據(jù)傳輸標準”。

二、環(huán)境搭建:快速引入與工具配置

Google.Protobuf for C#的使用分為“安裝NuGet包”與“配置proto編譯工具”兩步,核心是通過工具將.proto文件編譯為C#實體類,無需手動編寫序列化/反序列化代碼。

1. 安裝NuGet包(核心+輔助)

// 核心包(必裝,包含Protobuf核心API與序列化/反序列化邏輯)
dotnet add package Google.Protobuf

// 輔助包(可選,用于ASP.NET Core gRPC集成,微服務(wù)場景推薦)
dotnet add package Grpc.AspNetCore

// 編譯工具包(必裝,用于將.proto文件編譯為C#代碼)
dotnet add package Google.Protobuf.Tools

2. 配置proto編譯工具(關(guān)鍵步驟)

Protobuf的核心是.proto文件(數(shù)據(jù)結(jié)構(gòu)定義文件),需通過編譯工具將其轉(zhuǎn)換為C#實體類,有兩種配置方式(推薦方式1,自動化編譯):

方式1:項目文件配置(自動化編譯,推薦)

在.csproj文件中添加配置,編譯項目時自動將.proto文件轉(zhuǎn)為C#代碼,無需手動執(zhí)行命令。

<!-- 在.csproj文件的<Project&gt;標簽內(nèi)添加 -->
&lt;ItemGroup&gt;
  <!-- 配置proto文件,設(shè)置編譯類型為Protobuf -->
  <Protobuf Include="Protos\*.proto" GrpcServices="None" /&gt;
  <!-- GrpcServices="None" 表示僅生成實體類,若需gRPC則設(shè)為Server/Client -->
</ItemGroup>

方式2:手動命令編譯(靈活,適合臨時調(diào)試)

通過Google.Protobuf.Tools提供的protoc.exe工具,手動執(zhí)行編譯命令,生成C#代碼。

// 1. 進入項目根目錄(Protos文件夾存放.proto文件)
// 2. 執(zhí)行編譯命令(適配Windows系統(tǒng),其他系統(tǒng)替換protoc.exe為對應(yīng)可執(zhí)行文件)
protoc --csharp_out=./Models Protos/Student.proto
// 說明:--csharp_out=輸出目錄,Protos/Student.proto 為proto文件路徑
// 執(zhí)行后會在Models文件夾生成Student.cs實體類

3. 核心命名空間

using Google.Protobuf; // 核心API(序列化/反序列化、消息對象)
using Google.Protobuf.Collections; // 集合類型(如RepeatedField,對應(yīng)proto中的repeated)

三、基礎(chǔ)用法:proto定義與核心操作(必學(xué))

Google.Protobuf的使用核心是“定義proto文件→編譯為C#實體→序列化/反序列化”,其中proto文件定義是基礎(chǔ),決定了數(shù)據(jù)結(jié)構(gòu)與兼容性,重點掌握proto語法、編譯后實體的使用。

1. proto文件定義(核心,跨語言共用)

proto文件采用簡潔的語法,定義數(shù)據(jù)結(jié)構(gòu)(消息體)、字段類型、字段編號,字段編號決定了二進制格式的兼容性,不可隨意修改。

常用proto版本:proto3(推薦,語法簡潔,跨語言兼容性更好)、proto2(舊版本,支持更多可選配置),本文以proto3為例。

// Protos/Student.proto
syntax = "proto3"; // 聲明使用proto3版本
option csharp_namespace = "ProtobufDemo.Models"; // 生成C#類的命名空間

// 定義消息體(對應(yīng)C#中的類)
message Student {
  // 字段格式:類型 字段名 = 字段編號;
  int32 id = 1; // 整數(shù)類型,字段編號1(1-15占用1字節(jié),推薦優(yōu)先使用)
  string name = 2; // 字符串類型
  int32 age = 3; // 整數(shù)類型
  bool is_adult = 4; // 布爾類型
  double score = 5; // 浮點類型
  
  // 枚舉類型(需先定義枚舉)
  enum Gender {
    GENDER_UNSPECIFIED = 0; // proto3要求枚舉第一個值必須為0,作為默認值
    MALE = 1;
    FEMALE = 2;
  }
  Gender gender = 6; // 枚舉類型字段
  
  // 重復(fù)字段(對應(yīng)C#中的RepeatedField<T>,類似List)
  repeated string hobbies = 7; // 字符串列表
}

// 定義嵌套消息體(對應(yīng)C#中的嵌套類)
message Class {
  int32 class_id = 1;
  string class_name = 2;
  repeated Student students = 3; // 消息體列表(班級包含多個學(xué)生)
}

關(guān)鍵說明:

  • 字段編號:1-15占用1字節(jié),16-2047占用2字節(jié),優(yōu)先使用1-15,不可重復(fù),且修改后會破壞兼容性。
  • 默認值:proto3中,未賦值的字段會使用默認值(int32=0、string=空串、bool=false、枚舉=第一個值)。
  • 重復(fù)字段:repeated修飾的字段,編譯后對應(yīng)C#的RepeatedField,支持Add、Remove、遍歷等操作,比List更高效。

2. 編譯后C#實體類的使用

配置好編譯后,生成的C#實體類繼承自IMessage,包含字段的get/set方法、序列化/反序列化方法,無需手動編寫。

// 編譯后生成的Student類(簡化版,實際包含更多核心方法)
namespace ProtobufDemo.Models;

public sealed partial class Student : IMessage<Student>
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public int Age { get; set; }
    public bool IsAdult { get; set; }
    public double Score { get; set; }
    public Student.Types.Gender Gender { get; set; }
    public RepeatedField<string> Hobbies { get; } = new RepeatedField<string>();
    
    // 嵌套枚舉(對應(yīng)proto中的Gender)
    public enum Types
    {
        GenderUnspecified = 0,
        Male = 1,
        Female = 2
    }
    
    // 核心方法(序列化/反序列化)
    public byte[] ToByteArray(); // 序列化為二進制數(shù)組
    public static Student ParseFrom(byte[] data); // 從二進制數(shù)組反序列化
    public void WriteTo(CodedOutputStream output); // 寫入輸出流
    public static Student ParseFrom(CodedInputStream input); // 從輸入流讀取
}

// 調(diào)用示例:創(chuàng)建實體、賦值、序列化/反序列化
var task = Task.Run(() =>
{
    // 1. 創(chuàng)建實體并賦值
    var student = new Student
    {
        Id = 101,
        Name = "張三",
        Age = 20,
        IsAdult = true,
        Score = 95.5,
        Gender = Student.Types.Gender.Male
    };
    // 給重復(fù)字段賦值(RepeatedField用法類似List)
    student.Hobbies.Add("籃球");
    student.Hobbies.Add("編程");
    
    // 2. 序列化為二進制數(shù)組(核心操作)
    byte[] bytes = student.ToByteArray();
    Console.WriteLine($"序列化后長度:{bytes.Length}"); // 體積遠小于JSON
    
    // 3. 從二進制數(shù)組反序列化為實體(核心操作)
    Student deserializedStudent = Student.ParseFrom(bytes);
    Console.WriteLine($"反序列化后:{deserializedStudent.Name},{deserializedStudent.Age}歲");
    
    // 4. 嵌套消息體使用(Class類)
    var @class = new Class
    {
        ClassId = 1,
        ClassName = "計算機1班"
    };
    @class.Students.Add(student); // 添加學(xué)生到班級
});
task.Wait();

3. 核心序列化/反序列化方法(高頻用法)

Google.Protobuf提供多種序列化/反序列化方式,適配不同場景(內(nèi)存、文件、網(wǎng)絡(luò)流),重點掌握以下4種:

var student = new Student { Id = 101, Name = "張三" };

// 1. 序列化為二進制數(shù)組(最常用,適合網(wǎng)絡(luò)傳輸、內(nèi)存存儲)
byte[] bytes = student.ToByteArray();

// 2. 從二進制數(shù)組反序列化
Student student1 = Student.ParseFrom(bytes);

// 3. 序列化到文件(適合持久化存儲)
using (var stream = new FileStream("student.bin", FileMode.Create))
{
    student.WriteTo(stream);
}

// 4. 從文件反序列化
using (var stream = new FileStream("student.bin", FileMode.Open))
{
    Student student2 = Student.ParseFrom(stream);
}

// 5. 序列化為JSON(可選,適合調(diào)試,需安裝Google.Protobuf.JsonFormat包)
// dotnet add package Google.Protobuf.JsonFormat
string json = JsonFormatter.Default.Format(student);
// 從JSON反序列化
Student student3 = JsonParser.Default.Parse<Student>(json);

關(guān)鍵說明:JSON序列化僅推薦用于調(diào)試,生產(chǎn)環(huán)境優(yōu)先使用二進制序列化,才能體現(xiàn)Protobuf的性能優(yōu)勢。

四、進階特性:實戰(zhàn)必備技巧(深度重點)

基礎(chǔ)用法能滿足簡單序列化場景,進階特性則針對復(fù)雜業(yè)務(wù)場景(如字段擴展、集合優(yōu)化、跨語言通信、gRPC集成),是企業(yè)級開發(fā)的核心要點。

1. 字段擴展與向后兼容(核心優(yōu)勢)

Protobuf的最大優(yōu)勢之一是“向后兼容”,新增字段時,舊版本代碼無需修改,仍能正常反序列化(新增字段會被忽略),廢棄字段可標記為reserved,避免被復(fù)用。

// 升級后的Student.proto(新增字段,標記廢棄字段)
syntax = "proto3";
option csharp_namespace = "ProtobufDemo.Models";

message Student {
  int32 id = 1;
  string name = 2;
  int32 age = 3;
  bool is_adult = 4;
  double score = 5;
  Gender gender = 6;
  repeated string hobbies = 7;
  
  // 新增字段(字段編號8,未被使用過)
  string address = 8;
  
  // 廢棄字段(標記id=9為reserved,禁止后續(xù)使用)
  reserved 9;
  reserved "old_field"; // 也可通過字段名標記
  
  enum Gender {
    GENDER_UNSPECIFIED = 0;
    MALE = 1;
    FEMALE = 2;
  }
}

注意:不可修改已有字段的編號和類型,否則會破壞向后兼容,導(dǎo)致舊版本無法反序列化。

2. 集合類型優(yōu)化(RepeatedField vs List)

proto中repeated字段編譯后對應(yīng)C#的RepeatedField,而非List,RepeatedField針對Protobuf序列化做了優(yōu)化,性能優(yōu)于List,核心優(yōu)勢:

  • 序列化速度更快,避免List的額外內(nèi)存開銷。
  • 支持直接與List互轉(zhuǎn)(ToList()、AddRange()),兼容現(xiàn)有代碼。
var student = new Student();
// RepeatedField賦值
student.Hobbies.Add("籃球");
student.Hobbies.AddRange(new List<string> { "編程", "讀書" });

// 轉(zhuǎn)為List<T>
List<string> hobbyList = student.Hobbies.ToList();

// List<T>轉(zhuǎn)為RepeatedField
var newHobbies = new RepeatedField<string>();
newHobbies.AddRange(hobbyList);

3. 跨語言通信(C# ↔ Java 示例)

Protobuf的核心價值是跨語言兼容,一份proto文件,可編譯為不同語言的實體類,實現(xiàn)多語言通信。以下是C#序列化、Java反序列化的簡單示例:

// C# 端:序列化Student實體為二進制數(shù)組,發(fā)送到Java端
var student = new Student { Id = 101, Name = "張三", Age = 20 };
byte[] bytes = student.ToByteArray();
// 發(fā)送bytes到Java端(通過HTTP、TCP等方式)
// Java 端:接收二進制數(shù)組,反序列化為Student實體(proto文件與C#共用)
// 1. 編譯proto文件為Java實體(使用protoc工具)
// 2. 反序列化
byte[] bytes = 接收的二進制數(shù)據(jù);
Student student = Student.parseFrom(bytes);
System.out.println("接收數(shù)據(jù):" + student.getName() + "," + student.getAge());

關(guān)鍵:多語言共用同一.proto文件,確保字段編號、類型、消息體名稱完全一致,即可實現(xiàn)無縫通信。

4. ASP.NET Core 集成(gRPC通信場景)

在微服務(wù)場景中,Google.Protobuf常與gRPC結(jié)合使用(gRPC默認使用Protobuf作為序列化方式),實現(xiàn)高效的跨服務(wù)通信。以下是簡單集成示例:

步驟1:定義gRPC服務(wù)proto文件

// Protos/StudentService.proto
syntax = "proto3";
option csharp_namespace = "ProtobufDemo.Grpc";

// 定義gRPC服務(wù)
service StudentService {
  // 定義接口(請求參數(shù)、響應(yīng)參數(shù)均為Protobuf消息體)
  rpc GetStudent (GetStudentRequest) returns (Student);
}

// 請求消息體
message GetStudentRequest {
  int32 student_id = 1;
}

// 響應(yīng)消息體(復(fù)用之前定義的Student)
message Student {
  int32 id = 1;
  string name = 2;
  int32 age = 3;
}

步驟2:配置gRPC服務(wù)(Program.cs)

var builder = WebApplication.CreateBuilder(args);

// 添加gRPC服務(wù)(自動編譯proto文件)
builder.Services.AddGrpc();

var app = builder.Build();

// 映射gRPC服務(wù)
app.MapGrpcService<StudentServiceImpl>();

app.Run();

步驟3:實現(xiàn)gRPC服務(wù)

namespace ProtobufDemo.Grpc;

public class StudentServiceImpl : StudentService.StudentServiceBase
{
    // 實現(xiàn)接口方法
    public override Task<Student> GetStudent(GetStudentRequest request, ServerCallContext context)
    {
        // 模擬從數(shù)據(jù)庫獲取學(xué)生信息
        var student = new Student
        {
            Id = request.StudentId,
            Name = "張三",
            Age = 20
        };
        return Task.FromResult(student);
    }
}

步驟4:客戶端調(diào)用gRPC服務(wù)

// 客戶端代碼(C#)
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new StudentService.StudentServiceClient(channel);

// 調(diào)用gRPC接口(請求、響應(yīng)均為Protobuf實體)
var response = await client.GetStudentAsync(new GetStudentRequest { StudentId = 101 });
Console.WriteLine($"獲取學(xué)生:{response.Name},{response.Age}歲");

五、實戰(zhàn)場景:完整案例(序列化存儲+跨服務(wù)通信)

結(jié)合兩個高頻實戰(zhàn)場景,展示Google.Protobuf的完整用法,兼顧數(shù)據(jù)持久化與跨服務(wù)通信,貼合企業(yè)級開發(fā)需求。

場景1:數(shù)據(jù)持久化(序列化到文件/數(shù)據(jù)庫)

需求:將用戶列表序列化后存儲到文件,后續(xù)讀取并反序列化,用于數(shù)據(jù)備份與恢復(fù)。

// 1. 定義proto文件(UserList.proto)
syntax = "proto3";
option csharp_namespace = "ProtobufDemo.Models";

message User {
  int32 id = 1;
  string username = 2;
  string email = 3;
}

message UserList {
  repeated User users = 1; // 存儲多個用戶
}

// 2. 編譯后,實現(xiàn)序列化與持久化
public async Task PersistUserList()
{
    // 創(chuàng)建用戶列表
    var userList = new UserList();
    userList.Users.AddRange(new List<User>
    {
        new User { Id = 1, Username = "zhangsan", Email = "zhangsan@example.com" },
        new User { Id = 2, Username = "lisi", Email = "lisi@example.com" }
    });
    
    // 1. 序列化到文件(備份)
    using (var stream = new FileStream("users.bin", FileMode.Create))
    {
        userList.WriteTo(stream);
    }
    
    // 2. 從文件反序列化(恢復(fù))
    using (var stream = new FileStream("users.bin", FileMode.Open))
    {
        UserList restoredList = UserList.ParseFrom(stream);
        foreach (var user in restoredList.Users)
        {
            Console.WriteLine($"用戶:{user.Username},郵箱:{user.Email}");
        }
    }
    
    // 3. 序列化到數(shù)據(jù)庫(存儲二進制數(shù)據(jù))
    byte[] bytes = userList.ToByteArray();
    // 假設(shè)使用EF Core存儲到數(shù)據(jù)庫(字段類型為varbinary)
    var dbContext = new AppDbContext();
    dbContext.UserData.Add(new UserData { Data = bytes, CreateTime = DateTime.Now });
    await dbContext.SaveChangesAsync();
}

// 數(shù)據(jù)庫實體
public class UserData
{
    public int Id { get; set; }
    public byte[] Data { get; set; } // 存儲Protobuf序列化后的二進制數(shù)據(jù)
    public DateTime CreateTime { get; set; }
}

場景2:微服務(wù)跨服務(wù)通信(C# ↔ Python)

需求:C#微服務(wù)發(fā)送用戶數(shù)據(jù)(Protobuf格式)到Python微服務(wù),Python服務(wù)接收后反序列化并處理。

// C# 微服務(wù):序列化User實體,通過HTTP發(fā)送到Python服務(wù)
public async Task SendToPythonService()
{
    var user = new User { Id = 1, Username = "zhangsan", Email = "zhangsan@example.com" };
    byte[] bytes = user.ToByteArray(); // 序列化為二進制
    
    // 通過HTTP發(fā)送二進制數(shù)據(jù)
    var client = new HttpClient();
    var content = new ByteArrayContent(bytes);
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-protobuf");
    var response = await client.PostAsync("http://python-service:5000/receive-user", content);
}
# Python 微服務(wù):接收二進制數(shù)據(jù),反序列化為User實體(共用同一proto文件)
# 1. 安裝Python Protobuf包:pip install protobuf
# 2. 編譯proto文件為Python代碼:protoc --python_out=./ Protos/User.proto
from flask import Flask, request
import User_pb2 # 編譯后的Python實體類
app = Flask(__name__)
@app.route('/receive-user', methods=['POST'])
def receive_user():
    # 接收二進制數(shù)據(jù)
    data = request.get_data()
    # 反序列化為User實體
    user = User_pb2.User()
    user.ParseFromString(data)
    # 處理數(shù)據(jù)
    print(f"接收用戶:{user.username},郵箱:{user.email}")
    return "success"
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

六、避坑指南與最佳實踐(深度重點)

Google.Protobuf用法簡潔,但細節(jié)處理不當易導(dǎo)致兼容性問題、性能損耗,以下是企業(yè)級開發(fā)的避坑要點和最佳實踐。

1. 字段定義避坑

  • 字段編號不可隨意修改:一旦上線,字段編號不可修改、不可重復(fù),否則會破壞向后兼容。
  • 避免使用proto2與proto3混用:proto2與proto3語法不兼容,同一項目建議統(tǒng)一使用proto3。
  • 枚舉字段必須有默認值:proto3要求枚舉第一個值為0(UNSPECIFIED),作為未賦值時的默認值,否則編譯報錯。

2. 性能避坑

  • 優(yōu)先使用二進制序列化:避免使用JSON序列化(僅用于調(diào)試),否則無法發(fā)揮Protobuf的性能優(yōu)勢。
  • 使用RepeatedField而非List:repeated字段編譯后優(yōu)先使用RepeatedField,比List序列化速度更快、內(nèi)存開銷更小。
  • 避免頻繁序列化/反序列化:對于高頻訪問的數(shù)據(jù),可緩存序列化后的二進制數(shù)組,減少重復(fù)序列化開銷。

3. 跨語言兼容避坑

  • 多語言共用同一proto文件:確保所有語言使用相同的.proto文件,字段編號、類型、消息體名稱完全一致。
  • 注意類型映射差異:不同語言的類型映射需對應(yīng)(如proto的int32對應(yīng)C#的int、Java的int;proto的string對應(yīng)C#的string、Java的String)。
  • 避免使用語言特有類型:不使用proto中不支持的類型,確??缯Z言兼容性。

4. 通用最佳實踐

  • proto文件規(guī)范化:按業(yè)務(wù)模塊劃分proto文件,命名規(guī)范(如User.proto、Order.proto),添加注釋說明字段含義。
  • 封裝復(fù)用:將序列化/反序列化、文件讀寫等操作封裝為工具類,避免重復(fù)代碼,統(tǒng)一維護。
  • 版本管理:proto文件需納入版本控制(如Git),記錄字段變更歷史,便于追溯。
  • 異常處理:反序列化時需捕獲InvalidProtocolBufferException,處理非法二進制數(shù)據(jù),避免程序崩潰。

七、總結(jié)

Google.Protobuf for C#的核心價值是“高效、兼容、可擴展”,它徹底解決了傳統(tǒng)序列化方式的性能與兼容性痛點,是分布式系統(tǒng)、跨語言通信、數(shù)據(jù)持久化場景的最優(yōu)選擇之一。

掌握Google.Protobuf的關(guān)鍵:熟練定義proto文件(字段編號、類型、消息體),掌握序列化/反序列化核心操作,靈活運用進階特性(字段擴展、跨語言通信、gRPC集成),并遵循最佳實踐規(guī)避常見坑。

無論是微服務(wù)通信、物聯(lián)網(wǎng)數(shù)據(jù)傳輸,還是數(shù)據(jù)備份與恢復(fù),Google.Protobuf都能憑借其高性能、跨語言的優(yōu)勢,降低開發(fā)成本,提升系統(tǒng)效率。對于C#開發(fā)者而言,掌握它,能大幅提升分布式系統(tǒng)開發(fā)的核心能力。

擴展建議:深入學(xué)習(xí)Protobuf的高級特性(如oneof字段、map類型、自定義序列化),結(jié)合gRPC實現(xiàn)微服務(wù)全鏈路通信,結(jié)合Docker實現(xiàn)跨環(huán)境部署,進一步發(fā)揮其價值。

到此這篇關(guān)于C#常用類庫Google.Protobuf的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# Google.Protobuf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C# 如何獲取出錯的錯誤所在行數(shù)信息

    C# 如何獲取出錯的錯誤所在行數(shù)信息

    本文主要介紹 C# 中獲取錯誤所在行的方法,在開發(fā)過程中或是用戶在使用過程中,出錯的話方便我們快速定位到錯誤的位置,以便我們處理。
    2016-04-04
  • C#使用FileSystemWatcher控件實現(xiàn)的文件監(jiān)控功能示例

    C#使用FileSystemWatcher控件實現(xiàn)的文件監(jiān)控功能示例

    這篇文章主要介紹了C#使用FileSystemWatcher控件實現(xiàn)的文件監(jiān)控功能,結(jié)合實例形式分析了C# FileSystemWatcher組件的功能及監(jiān)控文件更改情況的具體使用技巧,需要的朋友可以參考下
    2017-08-08
  • DevExpress實現(xiàn)TreeList父子節(jié)點CheckState狀態(tài)同步的方法

    DevExpress實現(xiàn)TreeList父子節(jié)點CheckState狀態(tài)同步的方法

    這篇文章主要介紹了DevExpress實現(xiàn)TreeList父子節(jié)點CheckState狀態(tài)同步的方法,需要的朋友可以參考下
    2014-08-08
  • 快速學(xué)習(xí)c# 枚舉

    快速學(xué)習(xí)c# 枚舉

    這篇文章主要介紹了c# 枚舉的相關(guān)知識,文中講解非常細致,示例代碼幫助大家學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# System.Net.Dns 使用詳解

    C# System.Net.Dns 使用詳解

    System.Net.Dns類提供了一組靜態(tài)方法,用于執(zhí)行與DNS相關(guān)的操作,本文主要介紹了C# System.Net.Dns使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • C#?使用原生?System.IO.Compression?實現(xiàn)?zip?的壓縮與解壓

    C#?使用原生?System.IO.Compression?實現(xiàn)?zip?的壓縮與解壓

    這篇文章主要介紹了C#?使用原生?System.IO.Compression?實現(xiàn)?zip?的壓縮與解壓,zip?是一個非常常見的壓縮包格式,本文主要用于說明如何使用代碼?文件或文件夾壓縮為?zip壓縮包及其解壓操作,需要的朋友可以參考下
    2022-09-09
  • WinForms中主要控件的詳細使用教程

    WinForms中主要控件的詳細使用教程

    WinForms (Windows Forms) 是 Microsoft 提供的用于構(gòu)建 Windows 桌面應(yīng)用程序的框架,它提供了豐富的控件集合,可以滿足各種 UI 設(shè)計需求,以下是 WinForms 中主要控件的詳細使用教程,,需要的朋友可以參考下
    2025-05-05
  • HashTable、HashSet和Dictionary的區(qū)別點總結(jié)

    HashTable、HashSet和Dictionary的區(qū)別點總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于HashTable、HashSet和Dictionary的區(qū)別點,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • C#檢查foreach判讀是否為null的方法

    C#檢查foreach判讀是否為null的方法

    這篇文章主要介紹了C#如何檢查foreach判讀其是否為null,文中給出了示例代碼,介紹的很詳細,需要的朋友可以參考下方法
    2016-09-09
  • C#實現(xiàn)DataTable映射成Model的方法(附源碼)

    C#實現(xiàn)DataTable映射成Model的方法(附源碼)

    這篇文章主要介紹了C#實現(xiàn)DataTable映射成Model的方法,以實例形式較為詳細的分析了DataTable映射成Model的具體步驟與相關(guān)技巧,并附帶了完整實例源碼供讀者下載,需要的朋友可以參考下
    2015-11-11

最新評論

昭觉县| 海南省| 临沧市| 登封市| 黄陵县| 吉隆县| 杨浦区| 宜良县| 手游| 日照市| 和顺县| 凯里市| 河北省| 屯门区| 高要市| 沈阳市| 萨迦县| 梧州市| 嵩明县| 龙泉市| 墨江| 齐河县| 岚皋县| 慈利县| 左权县| 成安县| 莱州市| 霸州市| 顺平县| 泸州市| 民乐县| 大厂| 文安县| 盖州市| 邢台市| 饶阳县| 都匀市| 通辽市| 新营市| 县级市| 怀仁县|