首页 > 解决方案 > 为什么我们不能在 C# 的构造函数中使用 public/protected/private 关键字

问题描述

在 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# 不能做同样的事情?

标签: c#typescriptconstructor

解决方案


除非类是静态的,否则 C# 编译器会为没有构造函数的类提供一个公共无参数构造函数,以启用类实例化。一个类可以有一个公共/私有/受保护的访问修饰符。

您可以通过将构造函数设为私有来防止实例化类,如下所示:

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 构造函数有参数,你不能在函数定义中将参数定义为 public,下面是处理你想做的事情的正确方法:

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");
    }
}

如果还有什么你不明白或者我因为你的问题而误解了,并且细节写得不好,希望对你有所帮助


推荐阅读