访问者问题

时间:2010-07-01 02:53:31

标签: c# accessor

我想知道是否无法设置访问器以允许您访问访问者的变量。 错误示例:

    public void Main()
    {
        Object.name = "test"; //Can't access the object's subproperties
    }

    Objec ob = new Objec();
    public Objec Object
    {
        get { return ob; }
        set { ob = value; }
    }
class Objec
{
    string name;
    string value;
}

无论如何都要做上述事情(除了为每个值设置访问器外)? 谢谢,
最大

编辑:这是一个更好的例子

    public void Main()
    {
        //Now I can't change the X or Y properties, this will display an error
        ThePoint.X = 10;
        //To change the x value, I need to do the following:
        ThePoint = new Point(10,0);
    }

    private Point Poi = new Point();
    public Point ThePoint
    {
        get { return Poi; }
        set { Poi = value; }
    }

有没有办法让'ThePoint.X'工作(不只是公开展示'Poi')?

6 个答案:

答案 0 :(得分:2)

我猜你没有发布完整的代码。我想你现在无法访问Objec.name,因为它是一个私有变量(因此无法从Main()访问)。

尝试:

class Program
{
    public static void Main(string args[])
    {
        MyClass instance = new MyClass();
        instance.Child.ChildValue = "something";
    }
}

public class MyClass
{
    // The following code declares Public Properties 
    // rather than private variables.

    public string Value { get; set; }
    public string Name { get; set; }
    public MyChild Child { get; set; }

    public MyClass()
    {
        this.Child = new MyChild();
    }
}

public class MyChild
{
    public string ChildValue { get; set; }
}

答案 1 :(得分:2)

好的,有了你的新例子,很清楚问题是什么:当它实际上是一个结构时,你表现得好像是一个类。

当您说ThePoint.X = 10;时,您所做的只是更改原始点的副本的X.那是因为结构总是按值传递,而不是参考。

简而言之,错误符合您的期望。

答案 2 :(得分:1)

您应该公开名称和值变量以获得编译解决方案。或者更好的是,使用自动属性。

答案 3 :(得分:1)

您必须为要在C#中公开的每个类成员指定public

根据C# specification

  

类成员,包括嵌套   班级和结构,可以公开,   受保护的,受保护的,   内部的,或私人的。访问级别   对于类成员和结构成员,   包括嵌套类和结构,   默认是私人的。

答案 4 :(得分:0)

您需要进行以下更改:

public void Main()
{
    Object.name = "test"; //Can access the object's properties now...
}

Objec ob = new Objec();

public Objec Object
{
    get { return ob; }
    set { ob = value; }
}

public class Objec
{
    public string name {get; set;}
    public string value {get; set;}
}

答案 5 :(得分:0)

您实际问题的答案“无论如何都要做上述事情(除了为每个值设置访问器外)?”是的。

猜测一下你的意图,你似乎想要遵循一个名为Bridge的设计模式(你的类是围绕Object和/或Point的实现的抽象概念。您只会向您的班级观众展示您想要的原始实现的各个部分,在您的问题的情况下,每个值。