Открытые члены внутреннего класса

Мне задали интересный вопрос о том, почему в моем PR члены внутреннего класса были объявлены публичными, а не внутренними.

internal class ProductFamily 
{
    public int Id { get; set; }
    public string FamilyName { get; set; }
}

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

internal class ProductFamily 
{
    internal int Id { get; set; }
    internal string FamilyName { get; set; }
}

Это вызвало проблему с программой, поскольку класс был моделью данных для привязки Win Forms.

Единственным решением было оставить участников открытыми.

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

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

internal class Service : IService
{
    public void DoesSomething()
    {
        ...
    }
}

public interface IService
{
    void DoesSomething();
}

public static class ServiceRegistrationExtension
{
    public static IServiceCollection RegisterServices(this IServiceCollection services)
    {
        services.AddScoped<IService, Service>();
        return services;
    }
}

Мой вопрос: ошибочны ли эти предположения, или с появлением современных версий C# парадигма изменилась, поэтому наше понимание должно измениться?

Установка внутренних членов вызывала ошибку в привязке форм Win, мы ожидали, что она будет работать нормально, поскольку мы понимаем, что члены имеют ту же видимость, что и класс.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, привязка WinForms происходит только к общедоступным свойствам, даже если сами типы являются внутренними. Из обзора привязки данных (выделено мной):

Для простой привязки Windows Forms поддерживает привязку к общедоступным свойствам простого объекта.

Спасибо, благодаря вам я получил эту прямую ссылку Структуры для привязки

Chris Johnson 20.07.2024 10:59

Другие вопросы по теме