C # Почему я могу получить доступ к методам и свойствам нестатического класса через свойство, не создавая сначала экземпляр этого класса? - PullRequest
0 голосов
/ 24 октября 2019

Я очень новичок в C # и проходил серию базовых учебных курсов по C # и .NET Core. Во время этих курсов мне постоянно говорили, что если класс не является статическим, мне нужно создать новый экземпляр класса с помощью ключевого слова «new», чтобы получить доступ к его свойствам и методам. Тем не менее, на одном учебном курсе (основы .NET Core) есть пример, который не объясняется, когда это не так, и мне нужна помощь, чтобы понять, почему.

На курсе есть два класса«Ресторан» и «ДетальМодель». Все методы и свойства в классе Restaurant являются общедоступными, класс Restaurant и его свойства и методы не являются статичными. В классе DetailModel (размещенном в отдельном файле класса) создается новое свойство под названием Restaurant с таким типом Restaurant, как:

public Restaurant Restaurant { get; set; }

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

Я использую версию .NET Core Framework 2.2.

См. Код для обоих упрощенных классов ниже:

public class Restaurant
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Location { get; set; }
        public CusineType Cuisine { get; set; }

    }

 public class DetailModel : PageModel
    {

        public Restaurant Restaurant { get; set; }

        public void OnGet()
        {
            Restaurant.Name = "Test Restaurant";
        }
    }

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Что вам не хватает, так это тот факт, что в DetailModel есть свойство типа Restaurant, которое также называется Restaurant. Строка

Restaurant.Name = "Test Restaurant";

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

this.Restaurant.Name = "Test Restaurant";

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

Примечание: для работы имени необходимо, чтобы свойство было инициализировано где-то ранее (это new Restaurant() что вы ожидали).

0 голосов
/ 24 октября 2019

Проверьте определение свойства:

public Restaurant Restaurant { get; set; }

Это экземпляр класса Restaurant, который также называется Restaurant.

В этой строке

Restaurant.Name = "Test Restaurant";

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

Фактический экземпляр класса Restaurant будет создан при создании экземпляра класса DetailModel. Его конструктор по умолчанию создаст Ресторан как ноль, а не как новый Ресторан ().

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