[英]On how to properly use the following classes on graphs in C#
目前,我正在尝试通过实现各种算法来学习C#
。 我问了一个有关如何用C#
表示图形的问题 ,用户michaelb建议使用类。 我尝试在以下代码中使用这些类构造一个图形。
我习惯于具有构造函数的类,可以在其中设置要创建的对象的字段,但是这些类似乎仅具有默认的无参数构造函数。 我有三个问题:
类中的“实体”是否是偶数字段,例如public Node From;
在Edge
类中构成一个字段?
Edge
和Node
类相互引用不是很奇怪吗? 它看起来像两个自引用循环,其中它们是相互定义的。
当我尝试运行代码时,在步骤G.Nodes.Add(v1);
收到错误G.Nodes.Add(v1);
那说System.NullReferenceException
。 我做错了什么,使用这些类的正确方法是什么?
谢谢。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Graph G = new Graph();
Node v1 = new Node();
Node v2 = new Node();
Node v3 = new Node();
G.Nodes.Add(v1);
G.Nodes.Add(v2);
G.Nodes.Add(v3);
Edge e1 = new Edge();
Edge e2 = new Edge();
e1.From = v1;
e1.To = v2;
e2.From = v2;
e2.To = v3;
v1.EdgesOut.Add(e1);
v1.EdgesIn.Add(e1);
v2.EdgesOut.Add(e2);
v3.EdgesIn.Add(e2);
Console.WriteLine(G);
Console.ReadKey();
}
}
class Edge
{
public Node From;
public Node To;
}
class Node
{
public List<Edge> EdgesIn;
public List<Edge> EdgesOut;
}
class Graph
{
public List<Node> Nodes;
}
1-字段是否公开或完全设计为属性完全取决于您。 但是,是的,它们是字段或成员。
2-这些类都不包含“定义”或“事物”。 它们仅包含引用 。 很好。 想一想通常的TreeNode
类,它本身包含一个List<Node> Nodes
和一个Node ParentNode
..自引用 ,是的,正如您最初注意到的是null
,但没有问题。
3-是的,对于这些类,默认构造函数确实有些破旧。 因此,您会丢失List<T>
字段的实例化。 要么添加这个
Graph G = new Graph();
..
G.Nodes = new List<Node>(); // <<<---
G.Nodes.Add(v1);
..etc,或者通过提供缺少行的真正的构造函数来改进类!
public Graph() {Nodes = new List<Node>();}
构造函数的设计方式以及您编写的构造函数的数量再次取决于您以及您想要/需要/喜欢什么。
关于错误,缺少G.Nodes = new List<Node>(); G.Nodes.Add(v1); G.Nodes.Add(v2); G.Nodes.Add(v3);
G.Nodes = new List<Node>(); G.Nodes.Add(v1); G.Nodes.Add(v2); G.Nodes.Add(v3);
和
v1.EdgesOut = new List<Edge>(); v1.EdgesOut.Add(e1);
...
同上
是From
构成Edge类中的一个字段
public
只是为了无障碍
是Edge
和Node
引用,但这不是问题,因为在创建此类对象时,程序会将空引用放置在列表和类的前面。
程序员必须创建新对象并指向这些对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.