gpt4 book ai didi

c# - 如何促进 C# 变量的类型重构?

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:43 24 4
gpt4 key购买 nike

例如,我有这样一段代码:

IEnumerable<int> _en;
object _lock = new Object();

void Enumerate()
{
IEnumerable<int> en = null;

lock (_lock)
{
en = _en;
_en = new List<int>();
// ...
}

foreach (var i in en)
{
// ...
}
}

我想将项目类型从int更改为double,所以我至少有3个地方可以参加并更改它。为了促进这一点,像下面这样的事情是否有意义?还有什么我可以做的吗?

IEnumerable<int> _en;
object _lock = new Object();

void Enumerate()
{
var en = GetDefault(_en);

lock (_lock)
{
en = _en;
_en = CreateEmptyList(_en);
// ...
}

foreach (var i in en)
{
// ...
}
}

static T GetDefault<T>(T arg)
{
return default(T);
}

static List<T> CreateEmptyList<T>(IEnumerable<T> arg)
{
return new List<T>();
}

最佳答案

问题:

正如我决定理解的那样,您希望通过创建某种方法来减少重构期间需要更改代码的总体位置的数量,从而最大程度地减少工作环境中不断变化的需求中琐碎的重构任务的工作量。

一个可能的解决方案:

您可以混淆到一个点。

重要说明:如果您想从 double 更改为 int,可能需要重构调用代码的地方。协变和逆 rebase 本上起作用了。

double example = 2; // works
int example2 = 2.5; // needs to manually be refactored
  • 考虑到这一点,您可以将您的类创建为接受值类型 的通用基类,然后创建一个定义该 的传递子类>值类型(int、double 等)。

  • 您希望提供不需要显式创建的方法,比如到处都是 List,因为在重构时,所有这些都必须更改。

下面是一个可以执行类似操作的方法示例:

// We use params T[] here to reduce the need for any calling code to declare,
// for example, a List<int>, which would later need to potentially be changed in
// many places.
public void SetEnumerable(params T[] value)
{
_en = value;
}
  • 你可以只用数值来调用它:(根据我的第一个注释,如果你将基础泛型类型从 int 更改为 double,这将继续工作;但是,如果您从 double 更改为 int,则调用代码在重构之前不会编译。

例子:

// Here we use the SetEnumerable method without declaring a List<int>.
// Therefore, if you later change underlying type to double, the code
// below can remain unchanged.
var myEnumerable = new MyEnumerable();
myEnumerable.SetEnumerable(1, 2, 3);

类结构可能如下所示:

请注意,我并不是说这是一个很好的做法,而只是试图为您在这种情况下的独特问题提供可能的解决方案。 这个解决方案在性能方面的优点和/或它是否是一个好主意不在这个答案的范围内 :)

public class MyEnumerable : EnumerateBase<int> { }

public class EnumerateBase<T> where T : struct
{
private IEnumerable<T> _en;
object _lock = new Object();

public void SetEnumerable(params T[] value)
{
_en = value;
}

public void Enumerate()
{
IEnumerable<T> en = null;

lock (_lock)
{
en = _en;
_en = new List<T>();
// ...
}

foreach (var i in en) { /* ... */ }
}
}

在这个例子中,数据类型int只在一处声明,使得重构相对简单。

希望这能为您提供一些思考和洞察力,让您了解如何解决您提出的问题。

关于c# - 如何促进 C# 变量的类型重构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21818514/

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