C# 在指定对象之前引用对象的最佳方式?

C# 在指定对象之前引用对象的最佳方式?,c#,.net,C#,.net,对我来说,编码很大程度上是关于清晰性和概述。因此,我希望调用尚未在类的构造函数中赋值的对象。听起来是个愚蠢的想法,所以这里有一个例子(可能是愚蠢的): 到底有没有更好的办法 这种需求随着半边缘数据结构的实现而增加,其中边缘对象存储对另一个边缘对象的上一个引用和下一个引用。我认为循环引用并不好,但举例来说,列表对于下一项也有这样的引用 这只是第一个想法,但我认为主要的方法应该是将类创建与定义它们的关系分离开来 也许像这样的事情会奏效(不确定你的确切关系): 然后像这样使用它: SomeClass

对我来说,编码很大程度上是关于清晰性和概述。因此,我希望调用尚未在类的构造函数中赋值的对象。听起来是个愚蠢的想法,所以这里有一个例子(可能是愚蠢的):

到底有没有更好的办法


这种需求随着半边缘数据结构的实现而增加,其中边缘对象存储对另一个边缘对象的上一个引用和下一个引用。我认为循环引用并不好,但举例来说,列表对于下一项也有这样的引用

这只是第一个想法,但我认为主要的方法应该是将类创建与定义它们的关系分离开来

也许像这样的事情会奏效(不确定你的确切关系):

然后像这样使用它:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
SomeClass c = new SomeClass();

Connect(a, b);
Connect(a, c);
Connect(c, b);

(这种设计仍然不完美,但至少清楚地表明了IMHO会发生什么)

这只是第一个想法,但我认为主要的方法应该是将类创建与定义它们的关系解耦

也许像这样的事情会奏效(不确定你的确切关系):

然后像这样使用它:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
SomeClass c = new SomeClass();

Connect(a, b);
Connect(a, c);
Connect(c, b);

(该设计仍然不完美,但至少清楚了IMHO会发生什么)

不要在构造函数中指定边,而是使用单独的方法:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
SomeClass c = new SomeClass();
a.SetEdges(b, c);
b.SetEdges(a, c);
c.SetEdges(a, b);

这看起来更具可读性。您可能需要添加一些保护机制,以防止在指定边之前使用该类;但是,如果在构造函数中接受null,也会出现这种情况。

使用单独的方法,而不是在构造函数中指定边:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();
SomeClass c = new SomeClass();
a.SetEdges(b, c);
b.SetEdges(a, c);
c.SetEdges(a, b);

这看起来更具可读性。您可能需要添加一些保护机制,以防止在指定边之前使用该类;但是,如果您在构造函数中接受null,也会出现这种情况。

不幸的是,这是一种循环依赖,无法实现

  • 你需要一辆车去上班(a类车=新b类车)
  • 你需要钱买一辆车(b类车=c类车)
  • 你需要工作来赚钱(Someclass c=新的Someclass(a))
这不合适,您必须用其他物品替换一件物品。步行去,那不需要钱

交换两个变量的值时出现相同的问题:

var a = 5;
var b = 2;
var tempvar = a;
a = b;
b = tempvar;

您必须在初始化之后除去依赖项或绑定它们。这是一个逻辑问题,没有编程问题。

不幸的是,这是一个循环依赖,无法实现

  • 你需要一辆车去上班(a类车=新b类车)
  • 你需要钱买一辆车(b类车=c类车)
  • 你需要工作来赚钱(Someclass c=新的Someclass(a))
这不合适,您必须用其他物品替换一件物品。步行去,那不需要钱

交换两个变量的值时出现相同的问题:

var a = 5;
var b = 2;
var tempvar = a;
a = b;
b = tempvar;


您必须在初始化之后除去依赖项或绑定它们。这是一个逻辑问题,没有编程问题。

这看起来像是设计中的一个严重缺陷。这些仅仅是想法还是你有一个实际的用例?你能更具体、更详细地说明你到底想要实现什么吗?这个问题至少对我来说不是很清楚!也许你正在寻找类似依赖注入的东西(它不包括这个特定的场景,但一般来说,这种依赖依赖依赖于其他人等等)@SaurabhRai
A
的构造函数需要一个
B
的实例,但是
B
的构造函数需要一个
A
的实例。他有循环依赖关系。@BradleyUffner这是真的,但在我使用的所有DI框架中,他们真的讨厌循环依赖关系,而不仅仅是构造函数注入。这看起来是设计中的一个严重缺陷。这些仅仅是想法还是你有一个实际的用例?你能更具体、更详细地说明你到底想要实现什么吗?这个问题至少对我来说不是很清楚!也许你正在寻找类似依赖注入的东西(它不包括这个特定的场景,但一般来说,这种依赖依赖依赖于其他人等等)@SaurabhRai
A
的构造函数需要一个
B
的实例,但是
B
的构造函数需要一个
A
的实例。他有循环依赖项。@BradleyUffner这是真的,但在我使用的所有DI框架中,他们真的很讨厌循环依赖项,而不仅仅是构造函数注入。你可以将这一切都打包到工厂中,以确保这些项始终以正确的顺序创建,并提供依赖项。真的。虽然我可能需要了解更多关于实际用例的信息,以提出一些真正有用的建议。您可以将这些内容打包到工厂中,以确保始终按照正确的顺序创建这些项目,并提供依赖项。True。虽然我可能需要了解更多关于实际用例的信息,以提出一些真正有用的建议……另外,如果您关心代码的可读性,
first
,尤其是
snd
不是好的属性名称。像
FirstEdge
SecondEdge
这样的东西读起来更好。谢谢。那看起来更统一@Konnamiman我想如果我使用虚拟名称,我可以使它更通用。谢谢你的建议!。。。另外,如果您关心代码的可读性,
first
尤其是
snd
不是好的属性名称。像
FirstEdge
SecondEdge
这样的东西读起来更好。谢谢。那看起来更统一@Konnamiman我想如果我使用虚拟名称,我可以使它更通用。谢谢你的建议!