Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Nanodesy
13 / 9 / 4
Регистрация: 23.10.2018
Сообщений: 31

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

01.12.2019, 15:58. Показов 2807. Ответов 8

Студворк — интернет-сервис помощи студентам
Есть разница (и какая, если есть), между полями input и output? Если разницы нет, то как писать предпочтительней?

C#
1
2
3
4
5
    internal class Test
    {
        internal int input;
        public int output;
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.12.2019, 15:58
Ответы с готовыми решениями:

Модификаторы доступа, ооп
class Person { } class User : Person { } class Director : Person {

Модификаторы доступа, правильно ли я их понимаю
Прошу поправить, если есть ошибки ниже: 1) public – элемент, указываемый с этим модификатором, доступен любому коду как в пределах...

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

8
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
01.12.2019, 16:24
Nanodesy,
В общем случае, принято использовать свойства для публичного предоставления информации о состоянии объекта.

C#
1
public int Input { get; private set; } // Если нужно менять значение можно сделать сеттер с валидацией.
Поля, также в общем случае, принято делать закрытыми, например:

C#
1
2
3
4
5
6
7
8
9
public class Foo
{
    private readonly IBar _input;
 
    public Foo(IBar input)
    {
        _input = input ?? throw new ArgumentNullException(nameof(input));
    }
}
Разница между internal и public детально описывается по первому запросу в гугле. А так - поймете ее сами, как только первый крупный проект понюхаете). До этого времени описываемая разница - просто слова, которые достаточно сложно просто так понять.
1
 Аватар для Nanodesy
13 / 9 / 4
Регистрация: 23.10.2018
Сообщений: 31
01.12.2019, 16:37  [ТС]
aenye, о свойствах я знаю, обычно их и использую, про то что поля в общем случае закрыты, я слышал, но в голове ещё не отложилось (Благо студия постоянно напоминает мне об этом). Да и разницу между internal и public я понимаю (Наверное). internal - разрешает доступ для того проекта в котором определен класс (То есть это по сути тот же public, но только он не даст вызвать класс ( и не только класс), если он не находится в том же самом проекте).

Только вот суть вопроса была в том, какой доступ мне выбрать? Так как класс уже internal, то принцип работы и с public и с internal будет наверное одинаков, т.е мы просто не сможем получить доступ к этому классу из другого проекта, но к полям мы сможем получить доступ из любого мест этого же проекта. Возможно тут конечно какая-то особенность в наследовании, но это я и хочу узнать.
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
01.12.2019, 17:01
Nanodesy, Если вам нужно предоставить API для сторонней сборки - используйте public. Если логика класса предполагает его использование только внутри самой сборки - используйте internal.
Например, у Вас есть класс (BananaCountMonitor), который предоставляет интерфейс для получения текущего количества бананов в магазине. И класс, в котором определен метод подсчета бананов в магазине (BananaCounter).
Условимся, что объект класса BananaCounter используется только в классе BananaMonitor, когда нужно посчитать текущее кол-во бананов в магазине. Тогда BananaMonitor будет использоваться с модификатором public, т.к. все кому это интересно, могут узнать кол-во бананов. BananaMonitor можно пометить как internal, потому что никого не волнует, каким именно способом мы считаем бананы, мы можем поменять этот способ в любой момент, и никто "снаружи", кто использует данный счетчик, не пострадает при изменении его реализации.
1
 Аватар для Nanodesy
13 / 9 / 4
Регистрация: 23.10.2018
Сообщений: 31
01.12.2019, 17:14  [ТС]
aenye, и это тоже понятно) Посмотрите код ниже, у меня класс c модификатором доступа internal, он содержит в себе два поля с доступами public и internal. Условно представим, что данный класс входит в состав библиотеки, которая подключается к другому проекту. Мы не можем вызвать класс Test из другого проекта, так как он обладает модификатором internal. Соответственно, я полагаю, что так как мы не можем вызвать класс, то в данной ситуации (даже если поля были бы статичными), мы не можем и обратиться к полям этого класса. А теперь вопрос: Какая разница какой в данном случае между модификаторами internal и public полей input и output? (Ведь нам все равно, мы не можем вызвать эти поля, даже если бы оба поля имело бы модификатор public или internal) Если же в этом нет разницы, то какой модификатор использовать предпочтительней? (В данной ситуации модификаторы выполнют только роль дать доступ к полям в родном проекте, но не в чужом. А запрещает доступ к этим модификаторам internal)

C#
1
2
3
4
5
    internal class Test
    {
        internal int input;
        public int output;
    }
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
01.12.2019, 17:32
Лучший ответ Сообщение было отмечено Nanodesy как решение

Решение

Цитата Сообщение от Nanodesy Посмотреть сообщение
какой доступ мне выбрать?
1. представьте, что класс паблик
2. выберите соответствующую видимость для каждого члена класса
3. перестаньте представлять, что класс паблик
1
 Аватар для Nanodesy
13 / 9 / 4
Регистрация: 23.10.2018
Сообщений: 31
01.12.2019, 17:35  [ТС]
КОП, окей, логично, но ведь по сути это ни на что не влияет?
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
01.12.2019, 17:40
Цитата Сообщение от Nanodesy Посмотреть сообщение
но ведь по сути это ни на что не влияет?
с точки зрения доступности этих пабликов снаружи, пока класс остается internal - нет.

с точки зрения вложенного смысла, или есть вдруг решите сменить модификатор самого класса - влияет
3
40 / 25 / 7
Регистрация: 04.10.2012
Сообщений: 127
03.04.2020, 12:18
Я составил схему на основе этой статьи: Модификаторы доступа (Руководство по программированию в C#). Надеюсь, пригодится.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2020, 12:18
Помогаю со студенческими работами здесь

Зачем нужны модификаторы доступа. Хороший пример?
Если все сделать public -то не будет никаких проблем.

Изменить модификаторы доступа public к полям класса на private
Был тут вот такой код: namespace ConsoleApplication3 { class Room { public double length; //длина ...

Зачем писать модификаторы доступа перед словом class?
Например public class A {} Private class B {}

Модификаторы доступа – какие бывают, для чего используются
Здравствуйте, объясните, пожалуйста, с примерами : 1. Поля 2. Методы 3. Свойства 4. Модификаторы доступа – какие бывают, для чего...

Могут ли аксессоры свойства иметь различные модификаторы доступа
A) Да B) Нет C) Только аксессор get D) Только аксессор set


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru