2017-01-06 13 views
2

IsAssembly, IsPublic, IsFamily, IsFamilyOrAssembly, IsFamilyAndAssembly Я читал об этом, но я не могу понять, что каждый делает. Странная вещь здесь IsFamily и IsAssembly возвращает False в коде, но IsFamilyOrAssembly возвращается True.Связь между IsAssembly/IsFamily и IsFamilyOrAssembly

Может кто-нибудь дать объяснение по каждому из этих свойств, поскольку мне трудно понять из документации. Я наткнулся на все это, когда начал читать о Reflection в C#.

public class Example 
{ 
    public void m_public() {} 
    internal void m_internal() {} 
    protected void m_protected() {} 
    protected internal void m_protected_public() {} 

    public static void Main() 
    { 
     Console.WriteLine("\n{0,-30}{1,-18}{2}", "", "IsAssembly", "IsFamilyOrAssembly"); 
     Console.WriteLine("{0,-21}{1,-18}{2,-18}{3}\n", 
      "", "IsPublic", "IsFamily", "IsFamilyAndAssembly"); 

     foreach (MethodBase m in typeof(Example).GetMethods(
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) 
     { 
      if (m.Name.Substring(0, 1) == "m") 
      { 
       Console.WriteLine("{0,-21}{1,-9}{2,-9}{3,-9}{4,-9}{5,-9}", 
        m.Name, 
        m.IsPublic, 
        m.IsAssembly, 
        m.IsFamily, 
        m.IsFamilyOrAssembly, 
        m.IsFamilyAndAssembly 
       ); 
      } 
     } 
    } 
} 

Этот пример кода производит вывод, подобный следующему:

       IsAssembly  IsFamilyOrAssembly 
        IsPublic   IsFamily   IsFamilyAndAssembly 

m_public    True  False False False False 
m_internal   False True  False False False 
m_protected   False False True  False False 
m_protected_public False False False True  False 
+0

У вас есть вопросы? Какую информацию вы ищете точно и почему, по вашему мнению, эти свойства обеспечат ее? – CodeCaster

+0

@CodeCaster Я не знаю, как еще это изменить. Мне нужно знать функциональность этого и где его можно применять и какая разница между ними – Prabu

+1

Теперь вы обнаружили, что эти свойства являются взаимоисключающими и соответствуют определенным комбинациям модификаторов доступа. Что еще нужно знать? Кроме того, почему вы скопировали код из MSDN, но не запустили его? Выход не соответствует коду. – CodeCaster

ответ

3

член класса имеют модификаторы доступа, связанные с ними (общественный, внутренний, ...). Они определяют уровень объектно-ориентированной инкапсуляции, реализованной членом. Вы можете найти более подробную информацию по адресу here.

с помощью отражения, вы можете захотеть взглянуть на:

    /*Modifiers*/ 

IsPublic   public 

IsFamilyOrAssembly protected internal 

IsFamily   protected 

IsFamilyAndAssembly n/a 

IsAssembly   internal 

Если вы хотите, чтобы определить, является ли элемент виден в унаследованных типов, вам нужно проверить, используя выражение (m.IsFamilyOrAssembly || m.IsFamily || m.IsFamilyAndAssembly || m.IsAssembly). И точно только одно из этих свойств: true и все остальные false.

0

Эти методы проверяют определенные значения перечисления из перечисления MethodAttributes. К сожалению, это довольно сложный тип перечисления. Если рассматривать это early values:

public enum MethodAttributes 
{ 
    // NOTE: This Enum matchs the CorMethodAttr defined in CorHdr.h 

    // member access mask - Use this mask to retrieve accessibility information. 
    MemberAccessMask = 0x0007, 
    PrivateScope  = 0x0000,  // Member not referenceable. 
    Private    = 0x0001,  // Accessible only by the parent type. 
    FamANDAssem   = 0x0002,  // Accessible by sub-types only in this Assembly. 
    Assembly   = 0x0003,  // Accessibly by anyone in the Assembly. 
    Family    = 0x0004,  // Accessible only by type and sub-types.  
    FamORAssem   = 0x0005,  // Accessibly by sub-types anywhere, plus anyone in assembly. 
    Public    = 0x0006,  // Accessibly by anyone who has visibility to this scope.  
    // end member access mask 
    ... 

Мы можем наблюдать, что FamORAssem и FamANDAssem являются различными значениями, и они не связаны со значениями Family или Assembly. Смутно, это перечисление отмечено с помощью атрибута Flags, но когда дело доходит до значений доступа к члену, они не являются простыми побитовыми комбинациями.