c# - 将对象实例化为属性与大多数方法中的对象实例化
问题描述
使用 C# webforms 和包含的代码示例,将程序的对象实例化为类属性的正确方法或缺点/优点是什么(选项 1)?或者在每种方法中都将使用对象/s(选项 2)?考虑到有更多的方法和对象,虽然大多数方法会使用对象,但也有一些方法不会。
更新:
- 变量名称的设置仅用于示例目的。
- 问题更多的是关于性能/维护/可读性/代码重复的任何优点/缺点?
选项1:
public partial class MyPage : MyBasePage
{
//Declared as an attribute and instantiated at init
private MyClass MC;
protected void Page_Init(object sender, EventArgs e)
{
MC = new MyClass();
DoSomeStuff();
DoMoreStuff();
DoSomethingElse();
}
private void DoSomeStuff()
{
// Do stuff with MC
}
private void DoMoreStuff()
{
//Do more stuff MC
}
private void DoSomethingElse()
{
//Do some stuff WITHOUT MC
}
}
选项 2:
public partial class MyPage : MyBasePage
{
protected void Page_Init(object sender, EventArgs e)
{
DoSomeStuff();
DoMoreStuff();
DoSomethingElse();
}
private void DoSomeStuff()
{
//Declared and instantiated on every method that needs it
MyClass MC = new MyClass();
// Do stuff with MC
}
private void DoMoreStuff()
{
//Declared and instantiated on every method that needs it
MyClass MC = new MyClass();
//Do some stuff with MC
}
private void DoSomethingElse()
{
//Do some stuff WITHOUT MC
}
}
更新:Sham 提供的第三个选项怎么样?
private MyClass _MC;
private MyClass MC
{
get
{
if(_MC == null)
{
_MC = new MyClass();
}
return _MC;
}
}
解决方案
1 是否比另一个更好并不重要。它更多的是关于你到底想要做什么。因此,在方法中声明它并在该方法中使用它意味着它仅在该范围内可用。如果您在类级别声明,然后在该类的各种方法中使用它,那么您在使用它时必须更加小心。让我举个例子。
在选项 2 中,您可以:
private void DoMoreStuff()
{
//Declared and instantiated on every method that needs it
MyClass MC MC = new MyClass();
//Do some stuff with MC
}
这意味着 MC 仅在 DoMoreStuff 内部可用。如果您在另一个方法中创建另一个 MyClass MC MC(不是很好的命名顺便说一句),那将是一个完全不同的 MC 实例,与第一个无关。
但是,如果您使用选项 1,则每种方法都可以访问它,但每个方法也可以更改它。因此,如果 MC 有一个名为“Age”的属性,它是一个 int,一个方法将其设置为 23,然后另一个方法检查该属性,它应该是 23。另一种方法可能会在稍后出现并更新该属性并将其设置为 64 等. 然而,这对于诸如服务之类的东西很有用,它提供了通用的做事方法。
所以,这真的取决于 MC 的用途以及如何使用它。它是否为您的 MyPage 提供某种服务,您希望各种方法能够访问,例如日志记录,或者它只是保存数据的东西,比如可能具有姓名、年龄、身高等内容的人类?
推荐阅读
- openwrt - 在 CoovaChilli 中更改默认的 freeradius auth 和 acct 端口
- java - 在使用 Spring Boot 存储库时,Persistence.getPersistenceUtil 是一种更简单的测试延迟加载的 JPA 集合是否被初始化的方法吗?
- python - Python:读取excel文件但索引应该是日期时间而不是序号
- reactjs - React 开发:在 fetch 中添加 headers 属性会引发 CORS 错误
- javascript - 绘制重叠自身标记重叠的路径
- tensorflow - Tensorflow 一个节点的生命周期;
- python - 如何防止 Python 密钥侦听器泄漏到下一个终端?
- python - 从 AWS CDK 将查询字符串设置为 APIGateway
- docker - 授予 jenkins 访问 unix:///var/run/docker.sock 的权限
- python - 在服务器上运行 Python 抓取脚本