这个。并列出<t> </t>

时间:2014-06-02 15:23:08

标签: c# list this

我无法理解如何初始化对象列表并将其与类中的方法一起使用。我理解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;
}

这种方法创造了我想要的行为。但是,似乎我对为什么这是必要的缺乏了解。

  • 不应该&#34;初始化&#34;一个List,它是你的对象的属性与构造函数?
  • 为什么需要创建列表,然后将新列表的指针分配给您的属性?

6 个答案:

答案 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;
    }
}