【问题标题】:Beginner problems with many input parameters许多输入参数的初学者问题
【发布时间】:2009-11-02 10:50:18
【问题描述】:

嗨,我是 C# 的初学者。我有这堂课。 类 class1 有很多变量。

class class1
{
string variable1;
string variable2;
//...
string variable10
}

类 class2 和方法 doSomethig:

class class2
{
void doSomething(string s1, string s2, ..., string s10)
}

我在 class3 中使用 class1 和 class2 的实例。

class class3
{
class1 obj1 = new clas1();
class2 obj2 = new clas2();

//...
string result = obj.doSomething(obj1.variable1, obj1.variable2, ... , obj1.variable10)

}

问题是我从 class2 调用了 class3 方法 doSomething,而方法 doSomething 的输入参数是来自 class1 的变量。 我希望方法 doSomething 中的参数更少。我认为将 class1 中的变量添加到结构或类中。什么是最好的方法 ?谢谢。

【问题讨论】:

    标签: c#


    【解决方案1】:

    尝试传递对象 ITSELF。

    obj2.doSomething(obj1);
    

    如果您提供公共访问以获取变量,那么您在 class2 中的方法将能够访问这些值,您将释放方法定义和调用的压力。

    【讨论】:

    • 一个好主意,但需要注意一点:他显示的代码示例没有对字段提供修饰符,因此默认情况下它们是私有的。在这样做之前,他需要将它们设为内部或公开。
    • 当然,因此:“如果您提供公共访问权限来获取变量”
    • 阅读理解 FTW。 :)
    【解决方案2】:

    使用字符串数组(string[] 变量)代替变量 1、变量 2 等会更合适吗?还是某种字典?

    如果类 1 只包含函数的参数,另一种选择是将整个对象传递给函数:

    class class2 
    { 
       void doSomething(class1 c) { ... }
    } 
    

    【讨论】:

      【解决方案3】:
      class class2
      {
        void doSomething(class1 obj) {...}
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用结构来发送该值:

        struct Data
        {
            public int Var01 { get; set; }
            public int Var02 { get; set; }
            // ...
            public int Var10 { get; set; }
        }
        

        然后像这样使用:

        doSomething(new Data()
        {
            Var01 = 1,
            Var02 = 2,
            Var10 = 10
        });
        

        【讨论】:

        • 可变结构是邪恶的......通常也不鼓励具有大量字段的结构。是什么让您认为这里的结构合适?
        • 我想我可以建议将所有这些参数聚合成一个独特的结构,以避免使用许多参数的方法;您能否指出一个资源以了解有关可变结构的更多信息?感谢您的反馈,乔恩。
        【解决方案5】:

        首先,您不应该直接访问您班级中的字段。由于这看起来像 Java,你应该有 get 和 set 方法来访问字段:

        public String getVariable1()
        {
          return variable1;
        }
        
        public void setVariable1(String var1)
        {
          variable1 = var1;
        }
        

        编辑:因为它应该是 C#:

        public String Variable1
        {
          get; 
          set;
        }
        

        接下来回答你的问题,class2中的doSomething方法可以只取class1的一个实例:

        public String doSomething(Class1 class1Instance)
        {
          // implementation of doSomething goes here and accesses class1Instance.getVariable1() -> getVariable10();
        }
        

        【讨论】:

        • 它是 C#,而不是 Java - 在 C# 中字段默认为私有。
        • 公平点。刚刚注意到他的字符串声明中的小写 s。
        • C# 标签和问题的第一句都是不那么微妙的提示;)
        猜你喜欢
        • 2013-06-28
        • 2020-02-07
        • 2021-02-06
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        相关资源
        最近更新 更多