0

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

    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”)?

4

6 回答 6

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; }
}
于 2010-07-01T02:57:35.363 回答
2

好的,通过您的新示例,很明显问题出在哪里:当 Point 实际上是一个结构时,您的行为就好像 Point 是一个类。

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

简而言之,错误在您的预期中。

于 2010-07-01T21:12:55.913 回答
1

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

于 2010-07-01T02:55:52.027 回答
1

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

根据C# 规范

类成员,包括嵌套类和结构,可以是公共的、受保护的内部的、受保护的、内部的或私有的。默认情况下,类成员和结构成员(包括嵌套类和结构)的访问级别是私有的。

于 2010-07-01T03:22:09.513 回答
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;}
}
于 2010-07-01T03:15:25.213 回答
0

您的实际问题的答案“无论如何都要执行上述操作(除了为每个值创建访问器)?” 没有。

稍微猜测一下您的意图,您似乎想要遵循一种称为Bridge的设计模式(您的类是围绕Object和/或的实现的抽象Point)。在您的问题的情况下,您只会向您的班级听众展示您想要的原始实现的每个值。

于 2010-07-01T21:45:56.543 回答