gpt4 book ai didi

c# - 传递颜色的策略(避免引用?)

转载 作者:太空狗 更新时间:2023-10-29 23:08:59 26 4
gpt4 key购买 nike

我正在重构一个老化的 Windows 应用程序中的代码,我遇到了一种我不确定自己喜欢的模式:一个类具有全局颜色变量,如下所示:

private Color myForegroundColor = Color.Azure;
private Color myBackgroundColor = Color.Empty;
// ...etc.

其中有很多,它们通过 ref 传递给负责设置 UI 某些部分的方法。

我了解到 Color 是一个结构,因此每种颜色都由 ref 传递,以避免每次调用方法时都创建它的新副本。 IE 类似于:

// Avoid creating a copy of myForgroundColor inside SetUpButton():
MyHelperClass.SetUpButton(ref myForegroundColor);

我不禁觉得这种ref贯穿整个类和相关类的用法是不好的。感觉就像一个“code smell”,虽然我不能真正指出为什么。

我看过几篇关于类似问题的帖子,其中有诸如“使用包含颜色的类,然后将其作为值类型传递”之类的建议,但并不完全清楚它是如何实现的最好这样做。

我想做的是创建类似于以下内容的内容:

public class ColorContainer
{
public UiSettingsContainer()
{
MyColor = Color.Black;
MyNextColor = Color.Blue;
// ..etc...
}

public Color MyColor { get; private set; }
// ...etc....
}

这会让我保持对颜色的控制,但对内存的影响对我来说有点不清楚;如果我创建了此类的一个实例并将其传递给需要有关所含颜色信息的方法,那么不会在实现后立即创建 color 的副本(它是一个结构)方法利用它?

我假设这段代码会创建一个新副本,从而降低效率,我是否正确...

// Assumption: This creates a new copy of color in memory.
public void SetSomeColor(Color col){
someComponent.color = col;
}

// Calling it:
SetSomeColor(myColorContainerInstance.MyColor);

...比这个代码,它只会使用现有的结构?:

// Question: Does this avoid creating a new copy of MyColor in memory?
public void SetSomeColor(ColorContainer container){
someComponent.color = container.MyColor;
}

// Calling it:
SetSomeColor(myColorContainerInstance);

我目前倾向于类似于以下的解决方案,在该解决方案中,我将颜色收集在一个单独的类中并稍微重新组织代码,但继续使用 ref。然而,在这种情况下,MyColor 必须是 ColorContainer 中的公共(public)字段,这意味着我对谁可以设置它的值的控制较少:

// Assumption: This creates a new copy of color in memory.
public void SetSomeColor(ref Color col){
someComponent.color = col;
}

// Calling it:
SetSomeColor(ref myColorContainerInstance.MyColor);

这是一个好的解决方案,还是有更好的策略来处理这样的资源?

最佳答案

这整件事闻起来像 premature optimization ,特别是链接的第 3 部分和第 4 部分,所以...

另一种解决方案是只删除引用,并在需要时复制 Color 结构。结构本身并不太大(4 个 byte 成员和 4 个 bool 成员),除非您调用每秒更改颜色数百万次的代码,否则时间和所需内存不是问题。

关于c# - 传递颜色的策略(避免引用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14136967/

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