gpt4 book ai didi

c# - 参数和构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:03 26 4
gpt4 key购买 nike

我在 Stack OverflowMicrosoft Developer Network 和一些博客中阅读了很多详细的内容。普遍的共识是“一个构造函数不应该包含大量的参数。”所以遇到这个让我开始思考-

  • 初始问题:我的应用程序包含大约 15 个变量,这些变量在整个应用程序中不断使用。 我想出的解决方案是创建一个类,将值注入(inject) Properties

所以这似乎工作得很好,它让我的生活变得很轻松,因为我可以通过 Constructorobject 传递到另一个 class而不必将所有这些变量分配给每个 method。除了这会导致另一个问题-

public class ServerParameters
{
// Variable:
private string template;
private string sqlUsername;
private string sqlPassword;
private string sqlDatabase;
private string sqlServer;

public ServerParameter(string _template, string _sqlDatabase, string _sqlServer,
string _sqlUsername, string _sqlPassword)
{
template = _template;
sqlUsername = _sqlUsername;
sqlPassword = _sqlPassword;
sqlDatabase = _sqlDatabase;
sqlServer = _sqlServer;
}

// Link the private strings to a group of Properties.

}

所以这个 Constructor 已经变得非常臃肿 - 但现在我需要实现更多的参数

  • 问题二:所以我有一个臃肿的 Constructor 并通过实现不完全适合这个特定 Class 的其他项目。 我的解决方案是创建一个子类容器来容纳这些不同的,但能够利用这些

您现在看到了困境,它引发了所有重要的问题 - 当您只能继承一次时,您如何构建一个容器来容纳所有这些子类?

为什么你不应该在构造函数中使用这么多参数,为什么它很糟糕?

我对如何实现 Container 的想法,但我觉得我做错了 - 因为当我尝试使用一些 Null Reference Exception这些参数

public class VarContainer
{
private ServerParameter server;
private CustomerParameter customer;

public VarContainer(ServerParameter _server, CustomerParameter _customer)
{
server = _server;
customer = _customer;
}
}

我假设这是因为内部类本身实际上并没有获得那些分配的变量,但我完全迷失了实现我的目标的最佳方法-

最佳答案

“不要在你的构造函数中工作”的主要目的是避免在你创建一个对象时产生副作用,它会做大量的工作,这些工作可能会意外地影响全局状态,甚至需要很长时间才能完成可能会中断调用者的代码流。

在您的情况下,您只是在设置参数值,所以这不是“不工作”的意图,因为这不是真正的工作。最终容器的设计取决于您的要求 - 如果您可以接受在您的 class(或 struct)上设置的可变属性列表,那么可能是 initializer当你构造对象时更合适。

假设您从一开始就想要所有属性,并且想要像您在问题中所说的那样进行分组,我将构建类似于以下内容的内容:

public class Properties 
{
public ServerProperties Server { get; private set; }
public CustomerProperties Customer { get; private set; }

public Properties(ServerProperties server, CustomerProperties customer)
{
Server = server;
Customer = customer;
}
}

我将 ServerPropertiesCustomerProperties 的实现留给您,但它们遵循相同的实现模式。

关于c# - 参数和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com