c#中的getter和setter

时间:2010-09-04 09:40:46

标签: c#

有人能告诉我这个控制台应用程序的功能吗?究竟发生了什么?

此外,还有错误。你能解决它们吗?

public class Program
{
    static void Main(string[] args)
    {
        Name n = new Name[5]; // error
        n[0] = new Name(0); //error
        n[0] = "hgfhf"; //is this possible in this program?
        string nam = n[0];
    }
}
public class Name
{
    private string[] name;
    private int size;
    public Name(int size)
    {
        this.name = new string[size];
        this.size = size;
    }
    public string this[int pos] // what does this mean?
    {
        get
        {
            return name[pos];
        }
        set
        {
            name[pos] = value;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

这是indexer property。它就像一个普通的属性,但它允许你在其上使用[]语法:

public class Program
{
    static void Main(string[] args)
    {
        // Create a Name instance by calling it's constructor
        // capable of storing 1 string
        Name n = new Name(1);

        // Store a string in the name
        n[0] = "hgfhf";

        // Retrieve the stored string
        string nam = n[0];
    }
}

public class Name
{
    private string[] names;
    private int size;

    public Name(int size)
    {
        // initialize the names array for the given size
        this.names = new string[size];

        // store the size in a private field
        this.size = size;
    }

    /// <summary>
    /// Indexer property allowing to access the private names array
    /// given an index
    /// </summary>
    /// <param name="pos">The index to access the array</param>
    /// <returns>The value stored at the given position</returns>
    public string this[int pos]
    {
        get
        {
            return names[pos];
        }
        set
        {
            names[pos] = value;
        }
    }
}

答案 1 :(得分:0)

Name n = new Name[5]; //this is declaration error

- &GT;您需要声明一个类名称数组。

声明为:

Name[] n = new Name[5];


public string this[int pos] {}

这意味着您已经定义了一个索引器属性,并且索引器允许将classstruct的实例编入索引,就像数组一样。

现在你要分配一个字符串值(string nam = n[0]),这个值在定义属性时都是正确的。

答案 2 :(得分:0)

Name n = new Name[5];//error

变量n是对Name的单个实例的引用,因此您无法在其中放置数组。使用Name[]作为变量的类型。

n[0] = new Name(0);//error

当您将变量设为数组时,此错误将消失。

n[0] = "hgfhf";//is this possible in this program??

不,那会尝试用字符串替换Name实例。如果要将字符串放在Name实例中,则使用双索引,一个索引访问数组中的项,一个索引访问Name实例中的索引器属性:

n[0][0] = "asdf";

(但是,正如您为Name实例指定的大小为零,这会导致IndexOutOfRangeException。)

public string this[int pos]//wt this means????

这是索引器属性。它是一个带参数的属性,它通常用于访问项目,就像对象是一个数组一样。