gpt4 book ai didi

C# 构造函数链 - 更改执行顺序

转载 作者:太空狗 更新时间:2023-10-29 20:55:30 25 4
gpt4 key购买 nike

我想知道如何在 C# 中链接构造函数时更改执行顺序。我见过的唯一方法需要在当前构造函数之外首先调用链式构造函数。

具体看下面的例子:

public class Foo {
private static Dictionary<string, Thing> ThingCache = new Dictionary<string, Thing>();
private Thing myThing;

public Foo(string name) {
doSomeStuff();
if (ThingCache.ContainsKey(name)) {
myThing = ThingCache[name];
} else {
myThing = ExternalStaticFactory.GetThing(name);
ThingCache.Add(name, myThing);
}
doSomeOtherStuff();
}

public Foo(Thing tmpThing) {
doSomeStuff();
myThing = tmpThing;
doSomeOtherStuff();
}
}

理想情况下,我想通过这样做来减少代码重复(注意,我承认在这个人为的例子中,没有多少代码被保存,但我正在使用会受益更多的代码。我将这个例子用于清晰度):

public class Foo {
private static Dictionary<string, Thing> ThingCache = new Dictionary<string, Thing>();
private Thing myThing;

public Foo(string name) {
if (ThingCache.ContainsKey(name)) {
this(ThingCache[name]);
} else {
this(ExternalStaticFactory.GetThing(name));
ThingCache.Add(name, myThing);
}
}

public Foo(Thing tmpThing) {
doSomeStuff();
myThing = tmpThing;
doSomeOtherStuff();
}
}

这在 VB .Net 中是可能的,但 C# 不允许我在另一个构造函数的中间调用构造函数 - 仅在开始时使用 Foo() : this() 语法。

所以我的问题是,在链接构造函数时如何控制构造函数调用的顺序,而不是使用只能先调用另一个构造函数的冒号语法?

最佳答案

您不能在其他构造函数中调用构造函数。构造函数只能链接另一个构造函数,以便在它之前直接调用。

但是,为了解决您的特定问题,您可以制作一个可以接受两种类型参数的私有(private)构造函数,并让您的两个原始构造函数都简单地链接这个构造函数,为缺少的参数传递 null。

这比调用私有(private)初始化方法有优势,它可以很好地与 readonly 字段一起使用(即,如果 myThingreadonly,它仍然有效领域):

public class Foo
{
private static Dictionary<string, Thing> ThingCache =
new Dictionary<string, Thing>();
private Thing myThing;

public Foo(string name)
: this(null, name)
{
}

public Foo(Thing tmpThing)
: this(tmpThing, null)
{
}

private Foo(Thing tmpThing, string name)
{
if (tmpThing == null && name == null)
{
throw new System.ArgumentException(
"Either tmpThing or name must be non-null.");
}

doSomeStuff();
if (tmpThing != null)
{
myThing = tmpThing;
}
else
{
if (ThingCache.ContainsKey(name))
{
myThing = ThingCache[name];
}
else
{
myThing = ExternalStaticFactory.GetThing(name);
ThingCache.Add(name, myThing);
}
}
doSomeOtherStuff();
}
}

如果您使用的是 C# 4.0,您还可以使用命名参数或可选参数:

http://msdn.microsoft.com/en-us/library/dd264739.aspx

关于C# 构造函数链 - 更改执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5426709/

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