我无法理解如何初始化对象列表并将其与类中的方法一起使用。我理解List的机制,但不了解如何在方法中初始化它并稍后使用它。
例如,我希望有一个类在构造时创建List。然后,我想使用该类的方法将元素添加到列表中。列表中的元素是SolidWorks API定义的对象。
因此,为了构建List,我使用了:
public class ExportPoints : Exporter
{
public List<SldWorks.SketchPoint> listOfSketchPoints;
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
List<SldWorks.SketchPoint> listOfSketchPoints = new List<SldWorks.SketchPoint>();
}
public void createListOfFreePoints()
{
try
{
//imagine more code here
this.listOfSketchPoints.Add(pointTest);
}
catch (Exception e)
{
Debug.Print(e.ToString());
return;
}
}
执行期间失败,好像 listOfSketchPoints 从未初始化为列表。
所以,我尝试了一个 hack ,这很有效:
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
List<SldWorks.SketchPoint> listOfSketchPoints = new List<SldWorks.SketchPoint>();
this.listOfSketchPoints = listOfSketchPoints;
}
这种方法创造了我想要的行为。但是,似乎我对为什么这是必要的缺乏了解。
答案 0 :(得分:3)
您必须在构造函数中初始化列表。但是你在那里创建一个本地列表。所以替换
List<SldWorks.SketchPoint> listOfSketchPoints = new List<SldWorks.SketchPoint>();
与
this.listOfSketchPoints = new List<SldWorks.SketchPoint>();
我相当确定您现在知道为什么要仔细命名变量; - )
答案 1 :(得分:1)
在构造函数内部,在第一个示例中,您将创建名为listOfSketchPoints
的第二个局部变量,并将其分配给新列表。它在堆栈中并在退出构造函数后立即销毁。
通过将其分配给this
,您可以保持引用处于活动状态并允许稍后使用该对象。你可以用这个来达到同样的效果:
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
this.listOfSketchPoints = new List<SldWorks.SketchPoint>();
}
答案 2 :(得分:1)
在构造函数中指定标识符旁边的类型时,如下所示:
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
List<SldWorks.SketchPoint> listOfSketchPoints = ...
}
您正在声明一个与您在上面声明的字段完全无关的新变量。您初始化List<T>
的新实例并将其分配给局部变量,但您没有对该字段执行任何操作。这就是为什么您收到一个错误,即该字段尚未赋值。
要初始化字段,您可以直接指定它,如下所示:
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
this.listOfSketchPoints = new List<SldWorks.SketchPoint>();
}
另请注意,在没有局部变量或同名参数的情况下,使用this.
引用类成员是可选的(但通常仍然首选以避免混淆)。
答案 3 :(得分:1)
将构造函数更改为:
this.listOfSketchPoints = new List<SldWorks.SketchPoint>()
否则构造函数中的listOfSketchPoints只在构造函数的范围内,并且类属性永远不会被初始化。
答案 4 :(得分:0)
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
this.listOfSketchPoints = new List<SldWorks.SketchPoint>();
}
或
public List<SldWorks.SketchPoint> listOfSketchPoints = new List<SldWorks.SketchPoint>();
public ExportPoints(SldWorks.SldWorks swApp, string nameSuffix) :
base(swApp, nameSuffix)
{
}
答案 5 :(得分:0)
你可能会查出这段代码。在为一个特定类定义全局对象时会更好,它应该使用私有关键字而不是public关键字来声明。因为另一个表单或类可能会尝试访问该值。为特定类或程序定义的变量。 (它变成了安全风险)。当对象被全局声明时,它可以在同一个类中的任何方法中使用。请检查此代码
public class ExportPoints : Exporter
{
private List<SldWorks.SketchPoint> listOfSketchPoints;
public ExportPoints(SldWorks.SldWorks swApp) :
base(swApp)
{
listOfSketchPoints = new List<SldWorks.SketchPoint>();
}
public void createListOfFreePoints(string pointTest)
{
try
{
//imagine more code here
listOfSketchPoints.Add(pointTest);
}
catch (Exception e)
{
Debug.Print(e.ToString());
return;
}
}