В C #, в чем разница между публичным, приватным, защищенным и не имеющим модификатора доступа?

c# .net asp.net access-modifiers

611494 просмотра

15 ответа

Все мои студенческие годы я использую public, и хотел бы знать разницу между public, privateи protected?

И что же staticделать, а не иметь ничего?

Автор: MrM Источник Размещён: 17.05.2019 03:03

Ответы (15)


927 плюса

Решение

Модификаторы доступа

общественности

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

частный

Тип или член могут быть доступны только с помощью кода в том же классе или структуре.

защищенный

Доступ к типу или члену возможен только с помощью кода в том же классе или структуре или в производном классе.

частная защита (добавлено в C # 7.2)

Доступ к типу или члену возможен только с помощью кода в том же классе или структуре или в производном классе из той же сборки, но не из другой сборки.

внутренний

Доступ к типу или элементу может получить любой код в той же сборке, но не из другой сборки.

защищенный внутренний

Доступ к типу или члену может получить любой код в той же сборке или любой производный класс в другой сборке.

Когда модификатор доступа не установлен, используется модификатор доступа по умолчанию. Так что всегда есть какая-то форма модификатора доступа, даже если она не установлена.

статический

Модификатор static в классе означает, что класс не может быть создан и все его члены являются статическими. Статический член имеет одну версию независимо от того, сколько экземпляров его окружающего типа создано.

Статический класс в основном такой же, как и нестатический класс, но есть одно отличие: статический класс не может быть создан внешне. Другими словами, вы не можете использовать ключевое слово new для создания переменной типа класса. Поскольку нет переменной экземпляра, вы получаете доступ к членам статического класса, используя само имя класса.

Однако есть такая вещь, как статический конструктор . Любой класс может иметь один из них, включая статические классы. Они не могут быть вызваны напрямую и не могут иметь параметров (кроме параметров любого типа в самом классе). Статический конструктор вызывается автоматически для инициализации класса перед созданием первого экземпляра или ссылками на любые статические члены. Выглядит так:

static class Foo()
{
    static Foo()
    {
        Bar = "fubar";
    }

    public static string Bar { get; set; }
}

Статические классы часто используются как сервисы, вы можете использовать их так:

MyStaticClass.ServiceMethod(...);
Автор: mbillard Размещён: 05.03.2009 01:55

150 плюса

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

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

Защищено - То же, что и Private, плюс все потомки также могут видеть метод.

Статический (класс) - Помните различие между «Классом» и «Объектом»? Забудь обо всем этом. Они одинаковы со «статическим» ... класс является единственным экземпляром самого себя.

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

Автор: JosephStyons Размещён: 05.03.2009 02:26

137 плюса

Графический обзор (в двух словах)

видимость

По умолчанию, если вы не указали модификатор доступа, смотрите здесь:
Видимость по умолчанию для классов и членов C # (поля, методы и т. Д.)?

Невложенных

enum                              public
non-nested classes / structs      internal
interfaces                        internal
delegates in namespace            internal
class/struct member(s)            private
delegates nested in class/struct  private

Вложенные:

nested enum      public
nested interface public
nested class     private
nested struct    private
Автор: Stefan Steiger Размещён: 11.04.2014 08:00

22 плюса

По вопросу Ничего

  • Типы пространств имен по умолчанию являются внутренними
  • Любой член типа, включая вложенные типы, по умолчанию являются закрытыми
Автор: leppie Размещён: 05.03.2009 05:27

18 плюса

введите описание изображения здесь

using System;

namespace ClassLibrary1
{
    public class SameAssemblyBaseClass
    {
        public string publicVariable = "public";
        protected string protectedVariable = "protected";
        protected internal string protected_InternalVariable = "protected internal";
        internal string internalVariable = "internal";
        private string privateVariable = "private";
        public void test()
        {
            // OK
            Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(publicVariable);

            // OK
            Console.WriteLine(protectedVariable);

            // OK
            Console.WriteLine(internalVariable);

            // OK
            Console.WriteLine(protected_InternalVariable);
        }
    }

    public class SameAssemblyDerivedClass : SameAssemblyBaseClass
    {
        public void test()
        {
            SameAssemblyDerivedClass p = new SameAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(privateVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }

    public class SameAssemblyDifferentClass
    {
        public SameAssemblyDifferentClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.internalVariable);

            // NOT OK
            // Console.WriteLine(privateVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            //Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);
        }
    }
}

 using System;
        using ClassLibrary1;
        namespace ConsoleApplication4

{
    class DifferentAssemblyClass
    {
        public DifferentAssemblyClass()
        {
            SameAssemblyBaseClass p = new SameAssemblyBaseClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            // Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protectedVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protectedVariable);

            // Error : 'ClassLibrary1.SameAssemblyBaseClass.protected_InternalVariable' is inaccessible due to its protection level
            // Console.WriteLine(p.protected_InternalVariable);
        }
    }

    class DifferentAssemblyDerivedClass : SameAssemblyBaseClass
    {
        static void Main(string[] args)
        {
            DifferentAssemblyDerivedClass p = new DifferentAssemblyDerivedClass();

            // NOT OK
            // Console.WriteLine(p.privateVariable);

            // NOT OK
            //Console.WriteLine(p.internalVariable);

            // OK
            Console.WriteLine(p.publicVariable);

            // OK
            Console.WriteLine(p.protectedVariable);

            // OK
            Console.WriteLine(p.protected_InternalVariable);

            SameAssemblyDerivedClass dd = new SameAssemblyDerivedClass();
            dd.test();
        }
    }
}
Автор: Narottam Goyal Размещён: 24.05.2015 07:19

13 плюса

Репостить удивительные диаграммы из этого ответа .

Вот все модификаторы доступа на диаграммах Венна, от более ограниченных до более беспорядочных:

private:
введите описание изображения здесь

private protected: - добавлено в C # 7.2
введите описание изображения здесь

internal:
введите описание изображения здесь

protected:
введите описание изображения здесь

protected internal:
введите описание изображения здесь

public:
введите описание изображения здесь

Автор: Paul Размещён: 01.04.2018 10:17

11 плюса

Хм.

Смотрите здесь: Access Modifiers .

В двух словах:

Public дает методу или типу полную видимость из других типов / классов.

Private разрешает только типу, содержащему приватный метод / переменную, доступ к приватному методу / переменной (обратите внимание, что вложенные классы также имеют доступ к содержащим классам приватных методов / переменных).

Защищенный аналогичен частному, за исключением того, что производные классы могут также получать доступ к защищенным методам.

«Ничто» - это эквивалент VB.NET нулю. Хотя если вы имеете в виду «ничего», означающее «нет модификатора доступа», то это зависит, хотя очень грубое практическое правило (безусловно, в C #) заключается в том, что если вы не укажете явно модификатор доступа, метод / переменная объявление обычно настолько ограничено, насколько это возможно. т.е.

public class MyClass
{
    string s = "";
}

эффективно так же, как:

public class MyClass
{
    private string s = "";
}

Связанная статья MSDN предложит полное описание, когда явно не указан модификатор доступа.

Автор: CraigTP Размещён: 05.03.2009 01:53

8 плюса

общедоступный - доступ к нему может получить кто угодно.
private - доступ к нему возможен только из класса, частью которого он является.
Защищенный - доступ к нему возможен только из класса или любого объекта, который наследуется от класса.

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

Автор: Tony Размещён: 05.03.2009 01:55

4 плюса

ммм ...

Статический означает, что вы можете получить доступ к этой функции, не имея экземпляра класса.

Вы можете получить доступ непосредственно из определения класса.

Автор: gbianchi Размещён: 05.03.2009 01:53

4 плюса

Статус Private указывает, что переменные могут быть доступны только объектам одного класса. Защищенный статус расширяет этот доступ и для включения потомков класса.

«Из приведенной выше таблицы мы можем видеть разницу между частным и защищенным ... я думаю, что оба они одинаковы… так в чем же необходимость этих двух отдельных команд»

Проверьте ссылку MSDN для получения дополнительной информации

Автор: Grant Hood Размещён: 07.07.2010 08:13

3 плюса

Эти модификаторы доступа указывают, где видны ваши участники. Вы, вероятно, должны прочитать это. Возьмите ссылку, указанную IainMH, в качестве отправной точки.

Статические члены - один на класс, а не один на экземпляр.

Автор: jpfollenius Размещён: 05.03.2009 01:52

3 плюса

Внимательно следите за вашей доступностью ваших занятий. Публичные и защищенные классы и методы по умолчанию доступны для всех.

Кроме того, Microsoft не очень хорошо демонстрирует модификаторы доступа (публичные, защищенные и т. Д. Ключевые слова) при создании новых классов в Visual Studio. Так что будьте внимательны и подумайте о своей доступности для своего класса, потому что это дверь для ваших внутренних возможностей реализации.

Автор: Patrick Peters Размещён: 05.03.2009 02:21

2 плюса

Я думаю, что это связано с хорошим дизайном ООП. Если вы разработчик библиотеки, вы хотите скрыть внутреннюю работу вашей библиотеки. Таким образом, вы можете позже изменить внутреннюю работу вашей библиотеки. Таким образом, вы называете свои члены и вспомогательные методы закрытыми, и только методы интерфейса являются открытыми. Методы, которые должны быть перезаписаны, должны быть защищены.

Автор: Darius Kucinskas Размещён: 05.03.2009 01:57

1 плюс

C # имеет всего 6 модификаторов доступа:

private : член, объявленный с этой доступностью, может быть видимым внутри содержащего типа, он не виден никаким производным типам, другим типам в той же сборке или типам за пределами содержащей сборки. т. е. доступ ограничен только содержащим типом.

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

внутренняя : элемент, объявленный с этой доступностью, может быть видимым в сборке, содержащей этот элемент, он не виден ни одной сборке за пределами содержащей сборку. т. е. доступ ограничен только сборкой.

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

public : элемент, объявленный с этой доступностью, может быть видим в сборке, содержащей этот элемент, или в любой другой сборке, которая ссылается на содержащую сборку. т.е. доступ не ограничен.

C # 7.2 добавляет новый уровень доступности:

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

Исходный код, включающий пример кода нового модификатора частного защищенного доступа

Автор: Baccata Размещён: 20.12.2017 09:27

0 плюса

Еще один визуальный подход текущего модификатора доступа (C # 7.2). Надеемся, что схема помогает запомнить это проще.

введите описание изображения здесь

Автор: user1810087 Размещён: 21.02.2019 09:24
Вопросы из категории :
32x32