почему мы не можем использовать ключевые слова public / protected / private в конструкторе C# - PullRequest
0 голосов
/ 07 мая 2020

В TypeScript я могу написать следующий код, который примет аргумент конструктора environment и сделает его доступным как поле в классе:

class Example {

    constructor(private Environment environment) {

    }

    public get Name(): string { return this.environment.Name; }

}

И в C# эквивалентное поведение может производиться с помощью следующего кода. Здесь мне нужно вручную создать поле и присвоить его значение из параметра конструктора:

class Example
{

    public Example(Environment environment)
    {
        this.enviornment = enviornment;
    }

    private Environment environment;
    public string Name => this.environment.Name;

}

Почему C# не имеет аналогичных функций с TypeScript, чтобы его можно было записать так?:

class Example
{

    public Example(private Environment environment)
    {
    }

    public string Name => this.environment.Name;

}

Почему C# не может сделать то же самое?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Если класс не равен c, классам без конструкторов компилятор C# предоставляет конструктор без параметров publi c, чтобы разрешить создание экземпляров класса. Класс может иметь модификаторы доступа public / private / protected.

Вы можете предотвратить создание экземпляра класса, сделав конструктор закрытым, как показано ниже:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

Теперь в упомянутом примере выше:

public class MainWindowViewModel
    {
        public MainWindowViewModel(
            MainWindow view,
            public Enviornment enviornment)
        {

        }

        public string Name => this.enviornment.Name;
    }

Конструктор MainWindowViewModel имеет параметры, и вы не можете определить параметр как publi c внутри определения функции, ниже приведен правильный способ приблизиться к тому, что вы хотите сделать:

public class Environment {
    private string _SomeInfo;
    public String SomeInfo 
      { 
        get { return _SomeInfo; }
        set 
        { 
          if (value != null)
          {
            _SomeInfo = value; 
          }
        }
      }
}

public class Program : Environment
{
    public int VariableInfomration;

    private void program(int Data,string information){
       Data = 0;
       information ="";
       VariableInfomration = 1;
    }

    public string Name => SomeInfo;      

    public static void Main(string[] args)
    {
        Console.WriteLine("Example Constructor");
    }
}

Если вы все еще что-то не поняли, или я неправильно понял из-за вашего вопроса, и поэтому его детали не очень хорошо написаны, я надеюсь, что это вам поможет

0 голосов
/ 07 мая 2020

Согласно синтаксису конструктора или любого метода в c#, мы можем определить только тип данных и имя переменной как параметр. Модификаторы доступа определяются на уровне класса.

Например. Class Environment можно сделать publi c, но когда вы определяете параметр Type Environment,

Вам нужно передать только имя класса и имя переменной в конструкторе.

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