中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#語言中結構體的作用是什么

發布時間:2021-07-20 10:58:05 來源:億速云 閱讀:330 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關C#語言中結構體的作用是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

C#語言的結構體是一個比較復雜的東西,在此之上有很多需要設置的參數,否則用起來就很容易出錯。下面是msdn上一段描述,看看也許有助于理解C#語言的結構體。

通過使用屬性可以自定義結構在內存中的布局方式。例如,可以使用 StructLayout(LayoutKind.Explicit) 和 FieldOffset 屬性創建在 C/C++ 中稱為聯合的布局。

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  struct TestUnion  {  [System.Runtime.InteropServices.FieldOffset(0)]  public int i;  [System.Runtime.InteropServices.FieldOffset(0)]  public double d;  [System.Runtime.InteropServices.FieldOffset(0)]  public char c;  [System.Runtime.InteropServices.FieldOffset(0)]  public byte b;  }

在上一個代碼段中,TestUnion 的所有字段都從內存中的同一位置開始。

以下是字段從其他顯式設置的位置開始的另一個示例。

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]  struct TestExplicit  {  [System.Runtime.InteropServices.FieldOffset(0)]  public long lg;  [System.Runtime.InteropServices.FieldOffset(0)]  public int i1;  [System.Runtime.InteropServices.FieldOffset(4)]  public int i2;  [System.Runtime.InteropServices.FieldOffset(8)]  public double d;  [System.Runtime.InteropServices.FieldOffset(12)]  public char c;  [System.Runtime.InteropServices.FieldOffset(14)]  public byte b;  }

i1 和 i2 這兩個 int 字段共享與 lg 相同的內存位置。使用平臺調用時,這種結構布局控制很有用。

我做了一個簡單的測試程序,基本達成預定需求,不過程序該方式要求比較苛刻,如果要解析的數據與轉換C#語言的結構體不匹配就會引發一系列莫名其妙的異常(如內存不可讀等等之類),下面是測試程序的源代碼,有興趣的朋友可以看一看,也希望網友能提出更好的方案。

using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Text;  using System.Windows.Forms;  using System.IO;  using System.Runtime.InteropServices;   namespace RWFile  {  public partial class Form1 : Form  {  public Form1()  {  InitializeComponent();  }  //從文件中讀結構體  private void button1_Click(object sender, EventArgs e)  {  string strFile = Application.StartupPath + "\\test.dat";  if (!File.Exists(strFile))  {  MessageBox.Show("文件不存在");  return;  }   FileStream fs = new FileStream(strFile, FileMode.Open,   FileAccess.ReadWrite);  TestStruct ts = new TestStruct();  byte[] bytData = new byte[Marshal.SizeOf(ts)];  fs.Read(bytData, 0, bytData.Length);  fs.Close();  ts = rawDeserialize(bytData);  textBox1.Text = ts.dTest.ToString();  textBox2.Text = ts.uTest.ToString();  textBox3.Text = Encoding.Default.GetString(ts.bTest);  }   //向文件中寫結構體  private void button2_Click(object sender, EventArgs e)  {  string strFile = Application.StartupPath + "\\test.dat";  FileStream fs = new FileStream(strFile, FileMode.Create ,  FileAccess.Write);  TestStruct ts = new TestStruct();  ts.dTest = double.Parse(textBox1.Text);  ts.uTest = UInt16.Parse(textBox2.Text);  ts.bTest = Encoding.Default.GetBytes(textBox3.Text);  byte[] bytData = rawSerialize(ts);  fs.Write(bytData, 0, bytData.Length);  fs.Close();  }   [StructLayout(LayoutKind.Sequential,CharSetCharSet = CharSet.Ansi)] //,Size=16 public struct TestStruct  {  [MarshalAs(UnmanagedType.R8)] //,FieldOffset(0)]   public double dTest;  [MarshalAs(UnmanagedType.U2)] //, FieldOffset(8)]  public UInt16 uTest;  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]  //, FieldOffset(10)]  public byte[] bTest;  }   //序列化  public static byte[] rawSerialize(object obj)  {  int rawsize = Marshal.SizeOf(obj);  IntPtr buffer = Marshal.AllocHGlobal(rawsize);  Marshal.StructureToPtr(obj, buffer, false);  byte[] rawdatas = new byte[rawsize];  Marshal.Copy(buffer, rawdatas, 0, rawsize);  Marshal.FreeHGlobal(buffer);  return rawdatas;  }   //反序列化  public static TestStruct rawDeserialize(byte[] rawdatas)  {  Type anytype = typeof(TestStruct);  int rawsize = Marshal.SizeOf(anytype);  if (rawsize > rawdatas.Length) return new TestStruct();  IntPtr buffer = Marshal.AllocHGlobal(rawsize);  Marshal.Copy(rawdatas, 0, buffer, rawsize);  object retobj = Marshal.PtrToStructure(buffer, anytype);  Marshal.FreeHGlobal(buffer);  return (TestStruct)retobj;  }        }  }

看完上述內容,你們對C#語言中結構體的作用是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌兰浩特市| 常州市| 南宁市| 丽江市| 清涧县| 余庆县| 福泉市| 马鞍山市| 天津市| 武宣县| 托克逊县| 西昌市| 舒城县| 凤山市| 河西区| 内黄县| 洪洞县| 德化县| 桓台县| 汝阳县| 金湖县| 茶陵县| 岑溪市| 资源县| 揭西县| 金华市| 郸城县| 台州市| 乌苏市| 易门县| 临沂市| 吉林省| 囊谦县| 莱西市| 手机| 彭州市| 荥阳市| 邢台市| 龙里县| 辽阳市| 荣昌县|