Создание экземпляра класса из метода stati c в C# - PullRequest
3 голосов
/ 28 марта 2020

Я начал учиться C# только для того, чтобы быть продуктивным, не выходя из дома ( Пожалуйста, оставайтесь дома столько, сколько сможете, если находитесь в опасном регионе ).

У меня простой вопрос. Я знаю, что объект класса должен быть инициализирован первым, чтобы использовать этот (non-stati c) класс в C#.

Итак (я думаю) этот фрагмент кода делает это:

namespace ConsoleApp10
{
    class Program
    {
        public class Person
        {
            public string Name;

            public void Introduce0()
            {
                Console.WriteLine("My name is " + Name + ".");
            }
        }

        static void Main(string[] args)
        {
            var person0 = new Person();
            person0.Name = "Marry";
            person0.Introduce0();
            Console.ReadKey();
        }
    }
}

И результат: Меня зовут Женя. Затем я попытался сделать то же самое с помощью метода stati c:

namespace ConsoleApp10
{
    class Program
    {
        public class Person
        {
            public string Name;

            public void Introduce0()
            {
                Console.WriteLine("My name is " + Name + ".");
            }

            public static Person Introduce1(string str0)
            {
                var temp0 = new Person();
                temp0.Name = str0;
                temp0.Introduce0();
                return temp0;
            }
        }

        static void Main(string[] args)
        {
            var person0 = Person.Introduce1("Marry");
            Console.ReadKey();
        }
    }
}

И результат, как и ожидалось, тот же: Меня зовут Женя. И затем я добавил два куска кода в мой Main метод:

static void Main(string[] args)
{
    var person0 = Person.Introduce1("Marry");
    person0.Name = "Sarah";
    person0.Introduce0();
    Console.ReadKey();
}

И результат: Меня зовут Женя. Меня зовут Сара. Итак, вот мои вопросы: В последнем примере, почему мне не нужно инициализировать объект Person для доступа к полю Name и методу Introduce0 ? Доступ к методу stati c означает автоматическую инициализацию? Или это потому, что метод Introduce1 содержит инициализацию объекта Person ( temp0 )? Заранее спасибо и будьте в безопасности.

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Или это потому, что метод Introduce1 содержит инициализацию объекта Person (temp0)?

Да, именно так. Introduce1 - это метод stati c, что означает, что вы можете вызвать его без , сначала создав Person объект.

Затем в Introduce1 вы создаете новый Person объект, который впоследствии можно использовать для вызова методов экземпляра Person, например Introduce0.

Обратите внимание, что ваш код функционально эквивалентен

static void Main(string[] args)
{
    var temp0 = new Person();
    temp0.Name = "Marry";
    temp0.Introduce0();    
    var person0 = temp0;
    person0.Name = "Sarah";
    person0.Introduce0();
    Console.ReadKey();
}
0 голосов
/ 28 марта 2020

Это вторая причина: «Это потому, что метод Introduce1 имеет инициализацию объекта Person (temp0)?». Вы инициализируете объект Person, который вы возвращаете из Person.Introduce1. Для метода в классе вполне допустимо возвращать экземпляр этого класса.

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