【问题标题】:Accessing private member of a parameter within a Static method?在静态方法中访问参数的私有成员?
【发布时间】:2009-10-27 14:16:23
【问题描述】:

这段代码如何编译?运算符 int 中的以下代码可以访问 MyValue 类的私有变量吗?为什么?

class Program
{
    static void Main(string[] args)
    {
        Myvalue my = new Myvalue(100);
        Console.WriteLine(my + 100);
        Console.Read();
    }
}


public class Myvalue
{
    private int _myvalue;

    public Myvalue(int value)
    {
        _myvalue = value;
    }

    public static implicit operator int(Myvalue v)
    {
        return v._myvalue;
    }
}

【问题讨论】:

    标签: c# .net .net-2.0


    【解决方案1】:

    因为它在类中,所以它可以访问其中的私有变量。就像您的实例公共方法一样。它也以相反的方式工作。您可以从实例成员访问私有静态成员以创建 Monostate 模式。

    【讨论】:

    • 如果课程是静态的,我会理解的。但是既然对象是传参的,为什么不需要有accessor呢?
    • @Daok:因为你的静态方法是类的成员。如果该静态方法在其他任何地方都不会被允许。
    • 类成员不仅可以访问任何隐式this 对象的成员,还可以访问他们引用的任何该类型实例的成员。
    • 这是词法作用域。因此,特定类中定义的任何内容都可以访问该类中定义的任何其他内容。
    • 如果你添加了一个 MySecondValue 类。并且您将 Myvalue 更改为具有此方法: public static implicit operator int(MySecondValue v) { return v.//No _myValue } 您将无法访问 _myvalue 因为它是私有的。这就是为什么一开始我觉得这很奇怪,因为 MyValue 没有公共访问器。但如果你告诉我这是因为我可以访问班级内,我认为这是有道理的。
    【解决方案2】:

    private 表示类私有而不是实例私有。

    【讨论】:

    • 哼,不是实例私有的?我认为这是错误的,因为我不能使用: Myvalue my = new Myvalue(100); my._Myvalue = 1;因为实例“my”不能访问私有变量。
    • @Daok - 它仍然是类私有的,所以 my._myvalue 对外部调用者不可见。要查看实际情况,请将以下成员添加到 Myvalue 类: public int Test() { Myvalue my = new Myvalue(100);我的._myvalue = 1;返回我的._myvalue; }。然后从 Main 调用 new Console.WriteLine(Myvalue(1000).Test().ToString());
    【解决方案3】:

    operator int() 仍然是 MyValue 类的成员函数,因此可以访问 MyValue 类型对象的所有字段。

    请注意,静态只是意味着需要将 MyValue 对象作为参数传递给函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多