Tag: struct

结构初始化和默认参数的非直观行为

public struct Test { public double Val; public Test(double val = double.NaN) { Val = val; } public bool IsValid { get { return !double.IsNaN(Val); } } } Test myTest = new Test(); bool valid = myTest.IsValid; 上面给出了valid==true因为没有调用默认arg的构造函数,并且使用标准默认值val = 0.0创建对象。 如果struct是一个类,行为是valid==false ,这是我所期望的。 我发现行为的这种差异,特别是结构案例中的行为令人惊讶和不直观 – 发生了什么? stuct构造的默认arg服务是什么? 如果它无用为什么要让这个编译? 更新:澄清这里的重点不在于行为是什么 – 而是为什么在没有警告的情况下进行编译并且行为不直观。 即如果未应用默认arg,因为在新的Test()情况下没有调用构造函数,那么为什么要让它编译?

C#中的struct marshal

我在C#中有以下结构 unsafe public struct control { public int bSetComPort; public int iComPortIndex; public int iBaudRate; public int iManufactoryID; public byte btAddressOfCamera; public int iCameraParam; public byte PresetNum; public byte PresetWaitTime; public byte Group; public byte AutoCruiseStatus; public byte Channel; public fixed byte Data[64]; } 我用来将它转换为字节数组[]的函数是 static byte[] structtobyte(object obj) { int len = Marshal.SizeOf(obj); byte[] […]

F#struct构造函数中的参数validation

这是一个简单的C#结构,它对ctor参数进行了一些validation: public struct Foo { public string Name { get; private set; } public Foo(string name) : this() { Contract.Requires(name.StartsWith(“A”)); Name = name; } } 我已成功将其翻译成F#类: type Foo(name : string) = do Contract.Requires (name.StartsWith “A”) member x.Name = name 但是,我无法将其转换为F#中的结构: [] type Foo = val Name : string new(name : string) = { do Contract.Requires […]

在Struct中存储引用类型

说我在c#中有一个非常简单的结构 public struct foo{ public int a{get;set;} public int b{get;set;} public int c{get;set;} public int d{get;set;} public string hello {get;set;} } 我认为上面比使用class更“有效”? 在什么时候,如果我继续添加字符串属性,是时候将结构转换为类? 编辑:我原计划围绕以GDI为中心的应用程序传递此结构。 在处理主要的值类型时,我总是假设结构更高效。

在lambda中捕获时,C#Struct实例行为会发生更改

我已经解决了这个问题,但我正在试图找出它的工作原理。 基本上,我使用foreach循环遍历结构列表。 如果我在调用struct的方法之前包含引用当前结构的LINQ语句,则该方法无法修改结构的成员。 无论是否甚至调用LINQ语句,都会发生这种情况。 我能够通过将我正在寻找的值分配给变量并在LINQ中使用它来解决这个问题,但我想知道导致这种情况的原因。 这是我创建的一个例子。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WeirdnessExample { public struct RawData { private int id; public int ID { get{ return id;} set { id = value; } } public void AssignID(int newID) { id = newID; } } public class ProcessedData { public int ID […]

将struct更改为sealed类时,隐式转换失败

有问题的结构/类: public struct HttpMethod { public static readonly HttpMethod Get = new HttpMethod(“GET”); public static readonly HttpMethod Post = new HttpMethod(“POST”); public static readonly HttpMethod Put = new HttpMethod(“PUT”); public static readonly HttpMethod Patch = new HttpMethod(“PATCH”); public static readonly HttpMethod Delete = new HttpMethod(“DELETE”); private string _name; public HttpMethod(string name) { // validation of […]

使用C#中的Marshal.StructureToPtr将结构传递给C ++ API

我在我的代码中使用C ++编写的API(用C#编写)。 API需要一个参数作为指向结构的指针。 结构由“Int”和Char Arrays组成:例如 unsafe public struct ToBePassed { Int32 Num1; Int32 Num2; Char[] Data; // or fixed Char Data[255]; } 我不能直接将结构指针传递给API,因为在这种情况下,我收到错误,因为“指针不能引用Marshaled结构”。 代码编译成功但是当我执行(调试)代码时会出现此错误。 现在我有两个选择:第一: – 通过Ref传递结构:我想问一下当我通过ref传递结构时,需要结构指针的API是否可以接收地址。 请注意,API将在“Char [] Data”中返回Data。 第二: – 使用Marshal.StructureToPtr:这会将结构指针转换为IntPtr。 怀疑是相同的,API会正确接收吗? 谢谢你的时间! 此致,Swanand

不可变类vs结构

以下是类与C#中的结构不同的唯一方法(如果我错了请纠正我): 类变量是引用,而struct变量是值,因此struct的整个值被复制到赋值和参数传递中 类变量是存储在堆栈上的指针,指向堆上的内存,而struct变量作为值存储在堆上 假设我有一个不可变的结构,即struct,其字段在初始化后无法修改。 每次我将此结构作为参数传递或在赋值中使用时,该值都将被复制并存储在堆栈中。 然后假设我将这个不可变的结构化为一个不可变的类。 此类的单个实例将创建一次,并且只有对类的引用将被复制到赋值和参数传递中。 如果对象是可变的,那么这两种情况下的行为将是不同的:当一个人改变对象时,在第一种情况下,结构的副本将被修改,而在第二种情况下,原始对象将被改变。 但是,在这两种情况下,对象都是不可变的,因此这个对象的用户实际上是类还是结构没有区别。 由于复制引用比复制struct便宜,为什么要使用不可变结构? 此外,由于可变结构是邪恶的 ,看起来根本没有理由使用结构。 我哪里错了?

在传递给非托管代码之前固定updateble结构?

我使用一些旧的API,需要将结构的指针传递给异步运行的非托管代码。 换句话说,在我将struct指针传递给非托管代码之后,非托管代码会复制指针并立即返回。 非托管代码可以在后台访问该结构,在另一个线程中。 我无法控制在另一个线程和线程本身中运行的非托管代码。 fixed {}语句不能用于固定,因为它不是为异步非托管固定而设计的。 GCHandle只能引用引用,因此结构必须加框以使用GCHandle。 我试过了,它的确有效。 它的主要问题是您无法从托管代码更新结构。 要更新结构,首先我们需要将其取消装箱,然后更新,然后重新装箱,但是……哎呀……再次装箱?!? 这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码…不适用于我的案件。 如何在没有固定{}语句的情况下在内存中固定结构,以便我可以在不更改指针的情况下从托管代码更新它? 谢谢。 编辑: 只是想…有没有办法固定包含结构的父对象,然后获取结构的指针而不是容器对象?

不使用异步方法更新Struct的私有字段值

我刚刚在结构中使用异步方法遇到了一个奇怪的行为。 有人可以解释为什么会发生这种情况,最重要的是如果有解决方法吗? 这是一个简单的测试结构,仅仅是为了演示问题 public struct Structure { private int _Value; public Structure(int iValue) { _Value = iValue; } public void Change(int iValue) { _Value = iValue; } public async Task ChangeAsync(int iValue) { await Task.Delay(1); _Value = iValue; } } 现在,让我们使用该结构并执行以下调用 var sInstance = new Structure(25); sInstance.Change(35); await sInstance.ChangeAsync(45); 第一行实例化结构, sInstance._Value值为25 。 第二行更新sInstance._Value值,它变为35 。 现在第三行没有做任何事情,但我希望它将sInstance._Value值更新为45但是sInstance._Value保持35 […]