2013-05-03 1 views
14

При использовании C# я недавно понял, что могу называть частные функции объекта Foo от статических функций Foo и даже от других объектов Foo. После всего, что я узнал о модификаторах доступа, это звучит очень странно для меня.Зачем нужны модификаторы доступа на уровне классов вместо уровня объекта?

Насколько я знаю, вы делаете функцию частной, когда она делает что-то, что является частью какого-то внутреннего процесса. Только сам объект знает, когда использовать эти функции, потому что другие объекты не должны/не могут управлять потоком объекта. Есть ли причина, почему другие объекты того же класса должны быть исключены из этого довольно простого правила?

По желанию, пример:

public class AClass { 
    private void doSomething() { /* Do something here */ } 
    public void aFunction() { 
     AClass f = new AClass(); 
     f.doSomething(); // I would have expected this line to cause an access error. 
    } 
} 
+1

Я не уверен, что вы здесь описываете. Не могли бы вы привести несколько примеров? –

+0

Вы не можете вызвать нестатический метод из статического метода в том же классе без ссылки на объект. –

ответ

8

Когда вы делаете участника приватным, он является приватным для других классов, а не для самого класса.

Это может быть полезно, например, если у вас есть Equals метод, который необходим доступ к закрытым членам другого экземпляра:

public class AClass 
{ 
    private int privateMemberA; 

    // This version of Equals has been simplified 
    // for the purpose of exemplifying my point, it shouldn't be copied as is 
    public override bool Equals(object obj) 
    { 
     var otherInstance = obj as AClass; 
     if (otherInstance == null) 
     { 
      return null; 
     } 

     return otherInstance.privateMemberA == this.privateMemberA; 
    } 
} 
+0

Не потому ли у нас 'Object.GetHashCode()'? –

+0

Да @Arno, или Object.Equals (object otherObject), который на самом деле является хорошим примером использования частных членов другого экземпляра. –

+0

@ArnoSluismans Для двух объектов может быть справедливо следующее: A.GetHashCode() == B.GetHashCode(), но A.Equals (B) == false. – Artemix

0

частные средства, которые вы можете получить к нему доступ только из самого класса. Является ли оно статичным или нет, не имеет никакого значения. Хотя это не является исключением из этого правила ...

Christoph

2
Private

члены только доступные от всех других членов в рамках этого класса. Неважно, если это делается несколькими экземплярами или одним экземпляром.

Вы пытаетесь вытеснить членов только из this., поэтому им не позволено вызывать из внешнего мира (видно с точки зрения экземпляра), но их можно вызвать, как только вы вошли в область вашего экземпляра. Это просто невозможно в C#.

Будет хорошая особенность, хотя ... :)

0

Ну причина, вы можете получить доступ к закрытому методу, потому что вы находитесь внутри AClass

Например, если вы создаете BClass и создать AClass внутри вы не сможете получить доступ к закрытому методу

public class AClass 
{ 
    private void doSomething() { /* Do something here */ } 
    public void aFunction() 
    { 
     AClass f = new AClass(); 
     f.doSomething(); // we are inside AClass so we can access 
    } 
} 

public class BClass 
{ 
    private void doSomething() { /* Do something here */ } 
    public void aFunction() 
    { 
     AClass f = new AClass(); 
     f.doSomething(); // Will not compile because we are outside AClass 
    } 
} 

Поэтому в основном его ...

Public - Если вы можете увидеть класс, то вы можете увидеть метод

Private - Если вы являетесь частью класса, то вы можете увидеть метод, в противном случае нет.

+0

Я знаю это, как я указал в своем посте. Вопрос: почему он работает именно так. –

2

private (C# Reference) тема говорит:

Частный ключевое слово является модификатор доступа члена. Частный доступ - это минимальный разрешающий уровень доступа . Закрытые члены доступны только в теле класса или структуры, в которой они объявлены (...)

Еще:

Вложенные типы в том же теле, могут также получить доступ тех частных членов.

Так что следующий код будет работать отлично.

class Foo 
{ 
    private void PrivateMethod() 
    { 
    } 
    class FooBaby 
    { 
     public static void MethodB() 
     { 
      Foo foo = new Foo(); 
      foo.PrivateMethod(); 
     } 
    } 
} 

Что касается вопроса «почему» классов имеют модификаторы доступа, а не объекты, это один из способов, с помощью которых информация скрыта в объектно-ориентированном программировании (подробнее о Encapsulation (object-oriented programming).

Я также рекомендую вам пройти через глав:

  • 10.5 доступа Член
  • 17.2.3 модификаторы доступа

Standard ECMA-334 C# Language Specification.

19

private Модификатор претворяет Encapsulation принцип.

Идея состоит в том, что «внешний мир» не должен вносить изменения в внутренние процессы AClass, поскольку реализация AClass может меняться со временем (и вам придется изменить весь внешний мир, чтобы исправить различия в реализации - это почти невозможно).

Когда экземпляр класса ACAC выполняет доступ к внутренним компонентам другого экземпляра AClass, вы можете быть уверены, что оба экземпляра всегда знают подробности реализации AClass. Если логика внутренних процессов AClass изменена - все, что вам нужно сделать, это изменить код AClass.

На некоторых других языках, однако, private работает на уровне экземпляра, но это не так на C#.