gpt4 book ai didi

c# - 访问 C# 类中的变量是否会从内存中读取整个类?

转载 作者:行者123 更新时间:2023-11-30 18:56:08 24 4
gpt4 key购买 nike

我是 c# 的新手,有一个问题困扰了我一段时间。

当我学习 C# 时,我被教导一个类不应该包含很多变量,因为这样读取一个变量(或从中调用一个方法)会很慢。

有人告诉我,当我在 C# 类中访问一个变量时,它会从内存中读取整个类以读取变量数据,但这对我来说听起来很奇怪和错误。

例如,如果我有这个类:

public class Test
{
public int toAccess; // 32 bit
private byte someValue; // 8 bit
private short anotherValue; // 16 bit
}

然后从 main 访问它:

public class MainClass
{
private Test test;
public MainClass(Test test)
{
this.test = test;
}
public static void Main(string[] args)
{
var main = new MainClass(new Test());
Console.WriteLine(main.test.toAccess); // Would read all 56 bit of the class
}
}

我的问题是:它真的是真的吗?访问变量时是否读取整个类?

最佳答案

对于,这实际上没有任何区别;您总是只处理一个引用和该引用的偏移量。传递引用非常便宜。

当它确实开始变得重要时,结构就开始了。请注意,这不会影响类型上的调用方法 - 通常是基于引用的静态调用;但是当结构是方法的参数时,它就很重要了。

(编辑:实际上,在结构上调用方法时也很重要如果您是通过装箱操作调用它们,因为盒子也是一个副本;这是避免装箱调用的重要原因!)

免责声明:您可能不应该经常使用结构。

对于结构,值无论在何处用作值都会占用那么多空间,它可以作为字段、堆栈上的局部变量、参数方法等。这也意味着复制结构(例如,作为参数传递)可能很昂贵。但是,如果我们举个例子:

struct MyBigStruct {
// lots of fields here
}

void Foo() {
MyBigStruct x = ...
Bar(x);
}
void Bar(MyBigStruct s) {...}

然后在我们调用 Bar(x) 时,我们复制堆栈上的结构。同样,每当本地用于存储时(假设它没有被编译器煮掉):

MyBigStruct x = ...
MyBigStruct asCopy = x;

但是!我们可以通过传递一个引用 来解决这些问题。在当前的 C# 版本中,使用 inref readonlyreadonly struct 最合适:

readonly struct MyBigStruct {
// lots of readonly fields here
}
void Foo() {
MyBigStruct x = ...
Bar(x); // note that "in" is implicit when needed, unlike "ref" or "out"
ref readonly MyBigStruct asRef = ref x;
}
void Bar(in MyBigStruct s) {...}

现在有 个实际副本。这里的一切都在处理对原始 x 的引用。它是 readonly 的事实意味着运行时知道它可以信任参数上的 in 声明,而不需要值的防御性副本。

或许具有讽刺意味的是:如果输入类型是未标记为 readonly,因为编译器和运行时需要保证在 Bar 中所做的更改对调用者不可见。这些变化不需要很明显——任何方法调用(包括属性 getter 和一些运算符)都可以改变值,如果类型是邪恶的。作为一个邪恶的例子:

struct Evil
{
private int _count;
public int Count => _count++;
}

编译器和运行时的工作是可预测地工作即使你是邪恶的,因此它添加了结构的防御性副本。在结构上使用 readonly 修饰符的相同代码将无法编译


如果类型不是readonly,您也可以使用ref 执行类似于in 的操作,但是您需要注意如果 Bar 改变了值(有意或作为副作用),这些变化将对 Foo 可见。

关于c# - 访问 C# 类中的变量是否会从内存中读取整个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307085/

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