Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个类调用方法的正确方法是什么?_C# - Fatal编程技术网

C# 从另一个类调用方法的正确方法是什么?

C# 从另一个类调用方法的正确方法是什么?,c#,C#,我想知道使用另一个类的方法是否正确。我只需要使用这个方法一次。我使用静态方法来做这件事的方式可以接受吗?或者该方法应该是非静态的 如果该方法应该是非静态的,那么最好从IDisposable继承,这样我就可以在Using语句中使用该类了吗?或者仅仅创建类的实例并等待GC是可以接受的吗?在我看来,FillComboBox应该以类的形式作为私有非静态方法: public partial class Form1 : Form { private void StartApp() {

我想知道使用另一个类的方法是否正确。我只需要使用这个方法一次。我使用静态方法来做这件事的方式可以接受吗?或者该方法应该是非静态的


如果该方法应该是非静态的,那么最好从IDisposable继承,这样我就可以在Using语句中使用该类了吗?或者仅仅创建类的实例并等待GC是可以接受的吗?

在我看来,
FillComboBox
应该以类的形式作为私有非静态方法:

public partial class Form1 : Form
{   
private void StartApp()
    {
    LobGamma.LogInPanel.FillComboBox(LogInpanel_ComboBox, LobGamma.Connection.ObtainConnection());
    }
}


public class LogInPanel 
{
    public static void FillComboBox(ComboBox Box, SqlConnection con)
    {
        Box.Items.Clear();
        using (con)
        {
            SqlCommand com = new SqlCommand("Select Id From UsersTable", con);
            con.Open();
            using (SqlDataReader reader = com.ExecuteReader())
            {
                while (reader.Read())
                {
                    Box.Items.Add(reader["Id"].ToString());
                }
                reader.Close();
            }
        }
        con.Close();
    }
这是因为
FillComboBox
所做的一切都是计算组合框中应该包含哪些内容。这与UI有关,为什么不将其放在form类中呢?表单类应该初始化UI组件和与UI相关的东西,这正是
FillComboBox
所做的

是否最好从IDisposable继承,以便在Using语句中使用该类

只有在需要处理某些内容时,才需要实现
IDisposable
。但是,由于您已经在
FillComboBox
中有一个using语句,所以所有内容都已被处理

或者,根本不传递组合框:

public partial class Form1 : Form
{   

    private void StartApp()
    {
        LobGamma.LogInPanel.FillComboBox(LogInpanel_ComboBox, LobGamma.Connection.ObtainConnection());
    }
    private void FillComboBox(ComboBox Box, SqlConnection con)
    {
        Box.Items.Clear();
        using (con)
        {
            SqlCommand com = new SqlCommand("Select Id From UsersTable", con);
            con.Open();
            using (SqlDataReader reader = com.ExecuteReader())
            {
                while (reader.Read())
                {
                    Box.Items.Add(reader["Id"].ToString());
                }
                reader.Close();
            }
        }
        con.Close();
    }
}

问题是你是否真的需要一个类来完成这个操作。 通过构造函数调用的一个方法可以很容易地在构造时填充对象的项列表,并且不需要是类。 但是,如果您正在构建一个大型的类,比如处理业务和数据层(例如数据库)之间的连接的dataContext,那么您应该使用一个普通类(或者更好地使用实体框架之类的类)


对于微小的CRUD操作,只需使用私有方法。

这并不能真正回答您的问题,但我认为您不应该在
SqlConnection
上使用
using
,后者已作为参数传递给该方法。这可能不是一个好主意,因为您正在处理从方法外部提供的实例。这可能会让打电话的人感到惊讶。考虑将<代码>使用< /代码>到<代码> StestApp方法或创建<代码> SqLink连接内>代码> FILCOMBOBOX。谢谢,这很好。STATIC/实例在这里并不重要。您的代码还可以,但它仍然混合了GUI和业务逻辑。考虑一个不知道COMBOX的方法,但是返回一个<代码>列表>代码>谢谢,这没关系,因为它没有做太多的事情?谢谢你关于在GUI中混合的建议,我会解决这个问题。我正要写基本相同的答案,所以我只想指出,你不必这样传递combobox,因为它是类的一个成员,可以使用this.LogInpanel_combobox进行检索,它更易于阅读(可以说,你知道它在哪里)@我认为OP可能还有其他组合框需要填充。但这是个好主意。如果还没有这样做的话,我也会编辑它:这种行为通常是由附加到表单
Load
-eventhandler触发的。谢谢,这非常有用。是的,FillComboBox()属于表单本身。但所有SqlDataReader的东西都没有。
    private void FillComboBox(ComboBox Box, SqlConnection con)
    {
        LogInpanel_ComboBox.Items.Clear();
        using (con)
        {
            SqlCommand com = new SqlCommand("Select Id From UsersTable", con);
            con.Open();
            using (SqlDataReader reader = com.ExecuteReader())
            {
                while (reader.Read())
                {
                    LogInpanel_ComboBox.Items.Add(reader["Id"].ToString());
                }
                reader.Close();
            }
        }
        con.Close();
    }