gpt4 book ai didi

c# - 包含字符串的结构与包含字符串的类的性能

转载 作者:行者123 更新时间:2023-12-03 22:55:48 24 4
gpt4 key购买 nike

请查看这两个小示例:

public struct Struct
{
public readonly string StringValue;
public readonly int IntValue;

public Struct(string stringValue)
{
this.StringValue = stringValue;
this.IntValue = this.StringValue.GetHashCode(); // Just ignore this assignment, please :).
}
}

public class Class
{
public readonly string StringValue;
public readonly int IntValue;

public Class(string stringValue)
{
this.StringValue = stringValue;
this.IntValue = this.StringValue.GetHashCode(); // Just ignore this assignment, please :).
}
}

据我所知,如果我将 struct 作为参数传递,它将复制它 someObject.Method(this.cachedStruct); - 这反过来会复制一个 StringValue 因为 string 是不可变的,它会在内存中为这个字符串分配数组,这是相当昂贵的操作[如果我犯了错误,请原谅我,在这种情况下请纠正我]。

所以在这种情况下,我认为使用 Class 的实例比每次都复制 StringValue 会更快。问题:我的假设是否正确,对于这种情况,Class 是更好的选择,还是使用 Struct 更有益、更快速?

因为 Stringstring 是一样的。引用 - What is the difference between String and string in C#? .我不能在结构中使用 String 来阻止它在结构作为参数传递时创建新的 string 对象。

为了更好地解决这个问题,这里是另一个例子。对不起,如果这个例子有点粗糙。

public struct Struct
{
public string StringValue;
public int IntValue;

public Struct(string stringValue)
{
this.StringValue = stringValue;
this.IntValue = this.StringValue.GetHashCode(); // Just ignore this assignment, please :).
}
}

public class Class
{
public string StringValue;
public int IntValue;

private Struct _niceStruct;

public void Accept(Struct someStruct)
{
someStruct.StringValue = "Something new"; // In this case even if I don't change the value, it was already allocated.
// Because of copying of struct when it was passed as a parameter.

Console.WriteLine(this._niceStruct.StringValue); // "Something new".
}

public Class(string stringValue)
{
this.StringValue = stringValue;
this.IntValue = this.StringValue.GetHashCode(); // Just ignore this assignment, please :).

this._niceStruct = new Struct("Old value");

this.Accept(this._niceStruct);

Console.WriteLine(this._niceStruct.StringValue); // "Old value".

// String value was left unaffected.
// Which [even in the case I wouldn't change the value in the method] means that a new `string` object was allocated when a copy of `Struct` was created.
// When using `Class` in the same manner - it would change the `string`.
// New `string` object won't be allocated if value is unchanged.

// I assume that `string` allocation might be more costly than `Class` allocation in this instance.
}
}

我的理解是,如果我在不更改 string 值的情况下使用 Struct,每次我将它作为范围。当使用 Class 并将其实例作为参数传递时 - 它会将 Class 实例作为引用类型传递而不复制值,因此不会为 StringValue< 分配任何内存.

我的问题可能类似于 C#, struct vs class, faster? [duplicate]和其他问题(我相信我已经解决了所有问题(结构与类表现的问题))但没有一个给我答案。

最佳答案

例如,该字符串位于地址 0x0110 并称为 "hello"。该结构不存储字符串本身,它只存储对该字符串的引用。因此该结构将只存储"0x0110"。当您复制结构时,结构副本将存储相同的引用 “0x0110”。不是字符串,只是引用。不会创建新的字符串对象。但是,当您更改结构副本中的字符串时,例如从 "hello" 更改为 "bla",将在新地址创建一个新字符串。例如 "bla" 将位于地址 0x0220。然后结构副本将存储 "0x0220" 而不是 "0x0110"。原始结构仍将存储 "0x0110"。您现在在不同地址的内存中有 2 个字符串。

0x0110“你好”
0x0220 "bla"

PS:这是对实际情况的简化。

关于c# - 包含字符串的结构与包含字符串的类的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com