2

我对运营商有点困惑nameof()。因此,例如我不能nameof()在另一个类中使用类的私有字段,但我可以使用非静态属性public使用非static字段,所以我不需要实例化对象。 是否始终如一?为什么成员访问修饰符对 nameof() 很重要?


class A
{
    private int X;
    public int Y;
    public A()
    {
        var x = nameof(A.X);//OK
        var y = nameof(A.Y);//OK
    }
}
class B
{
    public B()
    {
        var x = nameof(A.X);//Compilation error
        var y = nameof(A.Y);//OK
    }
}
4

3 回答 3

5

访问修饰符 like 的目的private是隐藏实现细节。他们说“不,你不需要知道这个。这是实现细节”。这就是nameof不允许访问私有属性的原因。无论您在哪个班级,该班级都不应该知道其他班级的实现细节。

静态与非静态是不同的。它的目的不是隐藏你不需要知道的东西。它的目的只是区分属于类实例的成员和属于类本身的成员。这里你想要的只是那个成员的名字,它不需要创建实例,那么为什么不允许你呢?请注意,该成员是可访问的,即这不是您不应该知道的事情。

于 2018-06-21T09:09:56.840 回答
1

X类中的字段A是私有的。门是锁着的,无论你做什么都进不去。

这不是nameof问题,它的访问修饰符问题

访问修饰符(C# 编程指南)

所有类型和类型成员都有一个可访问性级别,该级别控制它们是否可以在您的程序集或其他程序集中的其他代码中使用。您可以在声明类型或成员时使用以下访问修饰符来指定其可访问性:

  • public 类型或成员可以由同一程序集或引用它的另一个程序集中的任何其他代码访问。

  • private 类型或成员只能由同一类或结构中的代码访问

  • protected 类型或成员只能由同一类或从该类派生的类中的代码访问。internal 类型或成员可以由同一程序集中的任何代码访问,但不能从另一个程序集中访问。

  • protected internal 类型或成员可以被声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。

  • private protected 类型或成员只能在其声明程序集中,由同一类中的代码或从该类派生的类型中访问。

于 2018-06-21T09:08:47.997 回答
-1

不是您问题的直接答案,但我通常会解决这个问题,但使用静态帮助器类:

class A
{
    public static class Properties
    {
        public const string X = nameof(A.X);
    }

    private string X { get; }
}

然后使用

A.Properties.X

它有点冗长,但仍然可以使重构工具有效地工作。

于 2018-06-21T09:34:12.070 回答