为什么成员访问修饰符对nameof()很重要?

时间:2018-06-21 09:03:24

标签: c# .net nameof

我对df <- data.frame( Channel_List = c("Nat Geo" , "Discovery", "CNBC", "CNN", "HBO", "Fox HD", "Cartoon Network"), stringsAsFactors = FALSE) library(dplyr) #create vectors with channels per group documentary.v <- c( "Nat Geo", "Discovery" ) news.v <- c( "CNBC", "CNN" ) entertainment.v <- c( "HBO", "Fox HD", "Cartoon Network" ) #use case_when to determine in which Genre the channel_list belongs df %>% mutate( Genre = case_when( Channel_List %in% documentary.v ~ "Documentary", Channel_List %in% news.v ~ "News", Channel_List %in% entertainment.v ~ "Entertainment", TRUE ~ NA_character_) ) # Channel_List Genre # 1 Nat Geo Documentary # 2 Discovery Documentary # 3 CNBC News # 4 CNN News # 5 HBO Entertainment # 6 Fox HD Entertainment # 7 Cartoon Network Entertainment 运算符有点困惑。因此,例如,我不能在另一个课程的nameof()中使用课程的私有字段,但可以使用nameof()的非public字段using non static property,因此不需要实例化对象。

是否始终如一?为什么成员访问修饰符对nameof()很重要?

static

3 个答案:

答案 0 :(得分:4)

诸如Animator之类的访问修饰符的目的是隐藏实现细节。他们说“不,您不需要知道这一点。这是实现细节”。这就是为什么不允许private访问私有属性的原因。无论您处于哪个类,该类都不应该知道其他一些类的实现细节。

静态与非静态有所不同。其目的不是隐藏您不需要了解的内容。其目的只是区分属于该类实例的成员和属于该类本身的成员。您只需要该成员的名称即可,无需创建任何实例,那么为什么不允许您呢?请注意,该成员是可访问的,也就是说,这不是您不应该知道的。

答案 1 :(得分:1)

X中的字段A是私有的。门是锁着的,无论做什么都无法进入。

这不是nameof问题,而是访问修饰符问题

Access Modifiers (C# Programming Guide)

  

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

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

  •   
  • 私人   只能通过相同类或结构中的代码访问类型或成员

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

  •   
  • 受保护的内部类型或成员可以通过声明该类型或成员的程序集中的任何代码或从派生类中进行访问   在另一个程序集中。

  •   
  • 私有保护类型或成员只能在其声明程序集中通过同一类或以下类型的代码访问:   从该类派生的。

  •   

答案 2 :(得分:-1)

不是您问题的直接答案,但是我通常使用静态助手类来解决此问题:

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

    private string X { get; }
}

然后使用

A.Properties.X

它有些冗长,但仍使重构工具有效地工作。