c# - 为什么在方法之外的类中不允许对象赋值
问题描述
在任何 c# 类中,这是允许的
Class Program
{
Dub obj=new Dub()
}
但不是这个
Class Program
{
Dub obj1= null;
Obj1=new Dub();
}
仅在课堂上尝试,而不是在任何功能中。
解决方案
该语言旨在将您的“事物”(类字段和类属性)与如何使用它们(方法)分开。然而,某些东西只是语法糖,可以让你更简洁。
事实上,你的代码
Class Program
{
Dub obj=new Dub()
}
在功能上(和语义上)等价于这个
Class Program
{
Dub obj;
public Program()
{
obj = new Dub();
}
}
因为它声明了一个字段(Dub obj
是执行此操作的代码部分),然后在构造它时对其进行初始化(这= new Dub()
就是您说要对其进行初始化的方式)。
你可能想知道为什么你有两种方法来做同样的事情,但关键是你在初始化器中写的必须是一个可以分配给正在初始化的字段的表达式。这是一个受限制的事情,当事情很容易时,您可以使用更少的代码来编写和审查。如果这不合适,您可以使用构造函数,您可以在其中自由地执行初始化程序中不允许的所有花哨的事情。
简而言之,指令是可以在方法内部使用的几乎不受约束的语句。表达式是指令,反之则不然。初始化程序需要设计表达式。
有关初始化器的更多信息,您可以查看Field MSDN 文档,其中包含更多详细信息和示例。
推荐阅读
- javascript - React 从父道具克隆对象在重新渲染时不断更新
- arrays - 根据特定值从数组中选择项目
- java - 如何修改 .PDF 文件,以便将其从在线和离线电子书应用程序中复制出来?
- r - 如何在空间上对物种出现数据的 data.frames 列表进行稀疏化?
- visual-studio - Visual Studio 2019 - 某些配置不会更新平台
- css - React 组件未使用 linaria 进行动画处理
- node.js - 码头工人 npm 安装 ERR
- javascript - 下一个未处理的运行时错误。未找到路由器实例
- java - 如何定义控制器方法以接受具有 Spring Boot 归档的媒体类型的 JSON?
- docker - 在 docker-compose.yml 中添加“extra_hosts”的更好方法