C# 哪一种编程实践更好?不必要的参数还是静态变量?

C# 哪一种编程实践更好?不必要的参数还是静态变量?,c#,parameters,constructor,static,xna,C#,Parameters,Constructor,Static,Xna,我正在用C#和XNA4.0制作一个游戏,我的一个类需要它自己的纹理。该类当前的使用方式如下: public Item() : base(MainClass.m_Texture) //This now takes a public static variable from the main game class { } 类构造函数: class Item : ItemBase //It uses a base class { public Item(Texture2D myTexture

我正在用C#和XNA4.0制作一个游戏,我的一个类需要它自己的纹理。该类当前的使用方式如下:

public Item() : base(MainClass.m_Texture) //This now takes a public static variable from the main game class
{
}
类构造函数:

class Item : ItemBase //It uses a base class
{
    public Item(Texture2D myTexture) : base(myTexure)
    {
    }
}
新实例:

Texture2D m_Texture = Content.Load<Texture2D>("Texture1");
Item m_item = new Item(m_Texture);
这消除了对参数的需要(我的代码更少),但我想知道这是否会导致性能和内存使用等其他问题


总的来说,哪一种被认为是更好的编程实践?拥有多个都使用相同参数值的类实例,或者将构造函数参数交换为静态变量?

对于性能,最好拥有一个静态变量,并在类之间共享。但通常性能影响几乎为零,除非是关键代码。(所谓关键代码,我指的是在一秒钟内运行多次的代码,例如更新方法,或导致应用程序出现瓶颈的代码)


否则,我建议在代码中使用一些感觉自然的东西。如果所有实例在任何时候都共享同一个纹理,那么很自然地使用一个变量,而不是多次复制它。

可以将纹理设置为Singleton

class TextureHolder
{
    static private TextureHolder instance;
    private Texture2D texture;
    private TextureHolder()
    {
        texture = Content.Load<Texture2D>("Texture1");

    }

    public static GetTexture()
    {
         if(instance==null)
         {
              instance = new TextureHolder();

         }
         return instance;

    }

这样,如果未创建任何项目,将永远不会加载纹理。但是如果创建了两个以上的项目,您将只加载纹理一次,并引用它一次

如果它总是相同的,为什么您需要该字段?请注意,您的第二段代码完全无效-您仍然在参数列表中声明某些内容。如果您提供了有效的code.Oops,将更容易帮助您在备选方案之间进行选择。我遗漏了一些重要的信息。该类实际上是从基继承的。我现在编辑了代码来解释这一点。希望这能让问题不那么令人困惑。纹理是否在其他地方使用?如果是这样,为什么它需要是
MainClass
中的静态字段?为什么不在
Item
中将其设为静态字段?因为我正在MainClass中加载所有内容。这就是所有纹理变量的存放位置。对我来说,听起来有点像“上帝的课堂”:(老实说,在这一点上,我们会试图解开你所有的设计,找出你需要在哪里创建新的
项目的实例等…我不认为这会非常适合这样。你的“建议”属于评论栏位..他的代码明显违反了单一责任原则和合作分离原则ncernI提到了我的建议,因为即使他关于性能的问题的答案是正确的,也可能会产生误导。一个专家程序员可以整天看到一些代码并提到缺陷。这个地方是用来回答问题的。静态全局变量的使用和考虑与性能几乎没有关系。更重要的是关于可访问性的讨论。在这一点上,你在他的基本构造函数上看到了ref吗?在方法中使用静态变量与将其传递给方法是完全不同的。。
public Item() : base(TextureHolder.GetTexture()) //This now takes a public static variable from the main game class {}