如何为类提供可由类方法访问的数组?

时间:2018-04-24 11:18:43

标签: c# oop

我刚开始学习OOP。我正在创建自己的类,它基于数组构建。它有一个名为length的属性和一个具有该长度的数组。

但是,length的实际值仅在构造函数中声明,因此我的数组在构造函数中作为私有变量被卡住。

如何实现一个这样的数组,即数组具有一定的用户选择长度,并且能够被类访问?方法

public class myClass
{
    private int length; //This is an attribute of my class
    public myClass(int myLength)
    {
            length = myLength;
            int[] myArray = new int[length];
    }
}

我希望myArray可以访问,但这是不可能的,因为它是构造函数中的局部变量。我想如果它是在Python中我可以让它成为一个全局变量。 (虽然我认为我仍然希望保持这个数组是私有的,因为它也是一个属性)。

谢谢!

注意:这不是家庭作业,而是我一直在挑战自己的事情。

2 个答案:

答案 0 :(得分:0)

以下是你的课程的样子,OOP方式:

public class MyClass
{
    public readonly int Length;
    public int[] Data { get; private set; }

    public MyClass(int dataLength)
    {
        Length = dataLength;
        Data = new int[dataLength];
    }
}

这里:

  • 使用用户指定的长度构造Data数组。
  • 您可以从课程内外访问LengthData
  • 实例化后,Length属性无法修改

另一种方法是让Length直接返回数组的Length属性,只要它被实例化:

public class MyClass
{
    public int Length { get { return Data == null ? 0 : Data.Length; } }
    public int[] Data { get; private set; }

    public MyClass(int dataLength)
    {
        Data = new int[dataLength];
    }
}

答案 1 :(得分:-1)

修正了答案,因为您在问题中添加了更多代码:

你无意中解决了自己的问题。看看你的private int length;声明。在使用构造函数public myClass(int myLength)初始化对象之后,仍然可以在对象中访问length变量。

下面的示例代码有一个新的public int GetLengthPlusOne()方法来访问长度变量。同样,您现在可以在另一种方法中使用myArray变量。

MyOtherClass

public class MyOtherClass
{
    public void SampleMethod()
    {
        MyClass cls = new MyClass(5); 
        Console.WriteLine(cls.GetLengthPlusOne()); //Output: 6
        var arr = cls.myArray;
    }
}

MyClass的

public class MyClass
{
    private int length; //This is an attribute of my class

    /* 
    * Declaring this within the class instead of the constructor allows it 
    * to be persisted in an instance of the class. This is a property.
    */
    public int[] myArray { get; set; }


    public MyClass(int myLength)
    {
            length = myLength;
            myArray = new int[length];
    }

    public int GetLengthPlusOne()
    {
        return length + 1;
    }
}

关于命名约定的附注:

对于C#,类名称开始大写(MyClass),而类的实例以小写(myClass)开头。有关详细信息,请查看the documentation