全球成员与传递参数

时间:2008-12-10 12:49:09

标签: c#

我有一个ASP.NET项目,其中我有一个包含10个局部变量的方法。此方法调用大约10个其他方法。 3个被调用的方法需要所有变量。将所有这些变量转换为全局成员是否被视为良好做法,然后它们不必作为参数传递?

7 个答案:

答案 0 :(得分:8)

如果要传递复杂状态,请将其打包在对象中 - 即

public class Foo {
     public string Key {get;set;}
     public decimal Quantity {get;set;}
     // etc
}

让方法接受这个对象作为参数。然后你只需创建一个这样的实例并传递它。

全球是一个很大的禁忌; ASP.NET是高度线程化的 - 这将是一场噩梦。每个请求状态是可能的,但有点混乱。

答案 1 :(得分:4)

这些变量是相互关联的,要么全部相关,要么可能分成几组?如果是这样,将它们封装成一个类型。因此,您可能有一半的变量与用户有关,一半与请求的操作有关 - 突然您的方法只需要10个变量。

让事情变得全球化几乎总是错误的方式。

答案 2 :(得分:3)

改为创建一个结构并传递结构而不是传递这10个参数

例如:

public struct user 
{ 
    public string FirstName; 
    public string LastName; 
    public string zilionotherproperties; 
    public bool SearchByLastNameOnly; 
    public datetime date1;
} 

答案 3 :(得分:2)

嗯,这完全取决于“全球成员”的意思。

如果考虑到您正在编写ASP.NET应用程序,那么您的意思是基于会话/应用程序的缓存值,那么它取决于。这会影响性能,因此您应该测量一下它是否会对您的应用产生任何影响。

如果你的意思是静态变量,那么没有。静态是每个应用程序,因此将适用于您的Web应用程序的所有用户,而不仅仅是一个人。线程静态也不是一个好主意,因为单个用户可能会在应用程序的生命周期中在线程之间浮动。

答案 4 :(得分:2)

如果你有真正对大量变量采取行动的方法,比如你提到的,你也可以考虑设计一个目的是充当数据容器的类。填充后,您可以将类传递给需要数据而不是十个参数的函数。

我不记得确切的示例,但在Microsoft的“框架设计指南”一书中,他们明确地描述了一个类似于您的场景以及它们如何在.NET Framework中遵循相同的方法。

此外,如果您需要传递那么多参数,请退后一步,确保相关代码不需要重构。在合法的情况下,方法需要大量数据,但我使用长方法签名作为一个标志,我需要查看方法内部以确保它只执行它所需要的内容。

答案 5 :(得分:1)

请务必注意拳击。如果您传递10种参考类型,则归结为个人偏好。

但是,如果要传递10种值类型,如果要将它们声明为类中的成员变量,则它们将被装箱,然后它们必须由收件人取消装箱。

如果将它们局限为方法堆栈中的局部变量(作为参数传递),它们将纯粹保留在堆栈上,而不是被装箱到堆中。

答案 6 :(得分:1)

对于纯粹的机械重构,将值组合在一起(如建议的那样)可能是最好的解决方案。

但是,您有一系列依赖方法,每个方法都处于共同状态(至少10个值)。听起来你应该设计一个类来处理这个操作。

该类将封装行为和相关状态,而不是简单的属性包(请参阅Anemic Domain Model)。