@Oleg_Lin

Как в C# реализованы: uniform инициализация, список инициализации в конструкторе, и дружественные функции и классы?

Подскажите пжл. аналоги или как следующие конструкции реализованы в c#:
uniform инициализация,
список инициализации в конструкторе,
и дружественные классы и функции.

Буду признателен.
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 2
- аналог uniform инициализации:
class Test {
    public int testValue;
}

Test test = new Test { testValue = 10 };


- списка инициализации в конструкторе нет
- дружественные классы и функции вообще нарушают ооп
Ответ написан
@majstar_Zubr
C++, C#, gamedev
UPDATED:

Задачу реализации дружественной функции можно решить, если целевой класс будет partial:

using System;

namespace FriendFunctionExample
{
    public partial class TargetClass
    {
        public TargetClass(int state)
        {
            privateState = state;
        }

        private int privateState = int.MaxValue;
        protected int targetNonPublicField = -1;

        public string Report() { return $"My protected value is {targetNonPublicField}"; }
        public object NativeInterfaceMethod01() { return new object(); }
        public int NativeInterfaceMethod02() { return 7; }
        public float NativeInterfaceMethod03() { return 3.14f; }
    }

}


namespace FriendFunctionExample
{

    interface IExtendedTargetClass
    {
        int PrivateState { get; set; }
        int TargetNonPublicField { get; set; }
    }

    public partial class TargetClass : IExtendedTargetClass
    {
        public int PrivateState { get => privateState; set => privateState = value; }
        public int TargetNonPublicField { get => targetNonPublicField; set => targetNonPublicField = value; }
    }

    class FriendFunctionHandler
    {
        private IExtendedTargetClass target;

        public FriendFunctionHandler(IExtendedTargetClass target)
        {
            this.target = target;
        }

        public string DoSomethingAndReport(int number)
        {
            FriendFuncion(number);
            return $"Set target protected value to 42 by friend function;";
        }

        private void FriendFuncion(int value) // set new value
        {
            target.TargetNonPublicField = value;
        }
    }

    class FriendFunctionExample
    {
        static void Main(string[] args)
        {
            Console.WriteLine(nameof(FriendFunctionExample));

            int initValue = 777;

            var target = new TargetClass(initValue);

            var ffh = new FriendFunctionHandler(target);

            Console.WriteLine(target.Report());
            Console.WriteLine(ffh.DoSomethingAndReport(42));
            Console.WriteLine(target.Report());

            Console.ReadLine();
        }
    }
}


FriendFunctionExample
My protected value is -1
Set target protected value to 42 by friend function;
My protected value is 42


OLD:

- свободных функций нет, но это быть статический класс с нужным методом,
- дружественную функцию можно реализовать через вызов метода расширения, а излишнюю открылось функции закрыть через internal
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы