Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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#_Optional Parameters - Fatal编程技术网

C# 对方法重载感到困惑

C# 对方法重载感到困惑,c#,optional-parameters,C#,Optional Parameters,我将.NET4.0与ASP.NET4.0和C一起使用,这是C4.0吗 我想在我的SQL Server数据库中插入一些数据,我有一个这样的方法来处理这个问题: public int InsertTrade( string symbol, string tradeSetupId, int tradeTypeId, decimal lotsPerUnit, string chartTimeFrame, int tradeGrade, int ex

我将.NET4.0与ASP.NET4.0和C一起使用,这是C4.0吗

我想在我的SQL Server数据库中插入一些数据,我有一个这样的方法来处理这个问题:

public int InsertTrade(
    string symbol,
    string tradeSetupId,
    int tradeTypeId,
    decimal lotsPerUnit,
    string chartTimeFrame,
    int tradeGrade,
    int executionGrade,
    int MFEPips,
    int MAEPips,
    decimal pctAccountRisked
    )
{
    SqlCommand cmd = new SqlCommand("usp_InsertTrade");
    cmd.Parameters.AddWithValue("@symbol", symbol);
    cmd.Parameters.AddWithValue("@pctAccountRisked", pctAccountRisked);
    cmd.Parameters.AddWithValue("@tradeSetupId", tradeSetupId);
    cmd.Parameters.AddWithValue("@lotsPerUnit", lotsPerUnit);
    cmd.Parameters.AddWithValue("@tfCode", chartTimeFrame);
    cmd.Parameters.AddWithValue("@MAEPips", MAEPips);
    cmd.Parameters.AddWithValue("@MFEPips", MFEPips);
    cmd.Parameters.AddWithValue("@tradeGrade", tradeGrade);
    cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
    return (InsertData(cmd, "trade"));
}
有几个非必填字段:tradeGrade、executionGrade、mfepis、MAEPips。usp_InsertTrade存储过程将这些可选参数公开为可空。用C编写此代码的最佳方法是什么?我正在学习编程,所以如果您能提供最佳实践方面的指导,那就太好了

以下是usp_InsertTrade的存储过程参数:

CREATE procedure [dbo].[usp_InsertTrade]
@symbol char(6),
@tradeSetupId varchar(10),
@tradeTypeId int,
@lotsPerUnit decimal(18,1),
@chartTimeFrame varchar(5),
@tradeGrade smallint = NULL,
@executionGrade smallint = NULL,
@MFEPips int = NULL,
@MAEPips int = NULL,
@pctAccountRisked decimal(3,2)
AS
非常感谢

更新

我更改了函数,使可选参数位于底部。像这样:

public int InsertTrade(
    string symbol,
    string tradeSetupId,
    int tradeTypeId,
    decimal lotsPerUnit,
    string chartTimeFrame,
    decimal pctAccountRisked,
    int? tradeGrade,
    int? executionGrade,
    int? MFEPips,
    int? MAEPips
    )
{
    SqlCommand cmd = new SqlCommand("usp_InsertTrade");
    // required parameters
    cmd.Parameters.AddWithValue("@symbol", symbol);
    cmd.Parameters.AddWithValue("@tradeSetupId", tradeSetupId);
    cmd.Parameters.AddWithValue("@tradeTypeId", tradeTypeId);
    cmd.Parameters.AddWithValue("@lotsPerUnit", lotsPerUnit);
    cmd.Parameters.AddWithValue("@tfCode", chartTimeFrame);
    cmd.Parameters.AddWithValue("@pctAccountRisked", pctAccountRisked);

    // optional parameters
    if (MAEPips.HasValue)
        cmd.Parameters.AddWithValue("@MAEPips", MAEPips);
    if (MFEPips.HasValue)
        cmd.Parameters.AddWithValue("@MFEPips", MFEPips);
    if (tradeGrade.HasValue)
        cmd.Parameters.AddWithValue("@tradeGrade", tradeGrade);
    if (executionGrade.HasValue)
        cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
    return (InsertData(cmd, "trade"));
}
当我使用以下代码调用函数时:

DBUtil DB = new DBUtil();
int tradeId = DB.InsertTrade (
    ddlSymbols.SelectedValue,
    ddlTradeSetups.SelectedValue, 
    ddlTradeTypes.SelectedValue, 
    decimal.Parse(txtLotsPerUnit.Text),
    ddlTimeFrames.Text,
    decimal.Parse(txtAcctRisk.Text));
我得到这个错误:

No overload for method 'InsertTrade' takes 6 arguments

您可以在参数中使用可为null的值,并在添加参数之前检查值,这样,如果未提供值,它将使用存储过程的默认值:

public int InsertTrade(
    ...
    int? executionGrade,
    ...
    )
{
    SqlCommand cmd = new SqlCommand("usp_InsertTrade");
    ...
    if(executionGrade.HasValue)
        cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
    return (InsertData(cmd, "trade"));
}

您可以在参数中使用可为null的值,并在添加参数之前检查值,这样,如果未提供值,它将使用存储过程的默认值:

public int InsertTrade(
    ...
    int? executionGrade,
    ...
    )
{
    SqlCommand cmd = new SqlCommand("usp_InsertTrade");
    ...
    if(executionGrade.HasValue)
        cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
    return (InsertData(cmd, "trade"));
}

请参阅有关可空类型的链接:

简而言之,将函数声明为:

public int InsertTrade(
    string symbol,
    string tradeSetupId,
    int tradeTypeId,
    decimal lotsPerUnit,
    string chartTimeFrame,
    int? tradeGrade,
    int? executionGrade,
    int? MFEPips,
    int? MAEPips,
    decimal pctAccountRisked
    )

请参阅有关可空类型的链接:

简而言之,将函数声明为:

public int InsertTrade(
    string symbol,
    string tradeSetupId,
    int tradeTypeId,
    decimal lotsPerUnit,
    string chartTimeFrame,
    int? tradeGrade,
    int? executionGrade,
    int? MFEPips,
    int? MAEPips,
    decimal pctAccountRisked
    )

另一种方法可以使用

另一种方法可以将

与C 4.0结合使用,您可以结合使用:

使用这些参数,您可能需要考虑重构——这将使您的代码在将来更易于阅读和修改。

用C 4,您可以结合使用:

使用这些参数,您可能需要考虑重构——这将使您的代码在将来更易于阅读和修改。

< P>我将创建一个结构来封装参数。 以下是我可能想到的可行方法:

可选参数。您可以使用C 4.0语法定义带有一些可选参数的方法。此功能在VB中已经存在,但最近添加到C中。缺点:您受限于如何使用可选参数。只有最后一个参数可以设置为可选。我的意思是,如果你有名字,地址,电话作为参数,按照这个顺序,你不能跳过地址和设置名字 结构如前所述,这是我最喜欢的方式。您可以设置任何空值,但必须为每个方法创建一个结构 定义重载:最糟糕的技术是为每个参数组合定义重载,这在大型参数集合中是不可行的 对象数组:仅当所有参数的类型不同时才可行。可以根据对象数组中每个条目的类型确定参数 字典:另一个有趣的方法。每个条目都映射一个键 希望能有所帮助

我会创建一个结构来封装参数

以下是我可能想到的可行方法:

可选参数。您可以使用C 4.0语法定义带有一些可选参数的方法。此功能在VB中已经存在,但最近添加到C中。缺点:您受限于如何使用可选参数。只有最后一个参数可以设置为可选。我的意思是,如果你有名字,地址,电话作为参数,按照这个顺序,你不能跳过地址和设置名字 结构如前所述,这是我最喜欢的方式。您可以设置任何空值,但必须为每个方法创建一个结构 定义重载:最糟糕的技术是为每个参数组合定义重载,这在大型参数集合中是不可行的 对象数组:仅当所有参数的类型不同时才可行。可以根据对象数组中每个条目的类型确定参数 字典:另一个有趣的方法。每个条目都映射一个键
希望对您有所帮助

听起来像您在使用Visual Studio 2010,C4.0,所以他们现在引入了可选参数:

听起来像您在使用Visual Studio 2010,C4.0,所以他们现在引入了可选参数:

我将创建一个扩展方法来消除对可空变量的重复检查。扩展方法类似于:

public static class SqlCommandExtensions
{
    public static void AddNullableInParameter<T>(this SqlCommand command, string columnName, Nullable<T> value) where T : struct
    {
        if (value.HasValue)
        {
            command.Parameters.AddWithValue(columnName, value.Value);
        }
    }
}

现在您可以编写命令了。AddNullableInParameter@yourParameter,您的NullableType;我将创建一个扩展方法来消除对可空变量的重复检查。扩展方法类似于:

public static class SqlCommandExtensions
{
    public static void AddNullableInParameter<T>(this SqlCommand command, string columnName, Nullable<T> value) where T : struct
    {
        if (value.HasValue)
        {
            command.Parameters.AddWithValue(columnName, value.Value);
        }
    }
}

现在您可以编写命令了。AddNullableInParameter@yourParameter,您的NullableType;而不是所有那些if语句。

他肯定不需要检查它是否有值,因为它将直接传递到存储过程,是null还是其他?@Moo Juice SQL null与C null是不同的。要在C中提到SQL NULL,您需要说DBNull.Value。在这里,由于存储过程定义中的默认值是空的,所以最简单的方法就是什么都不说。@Moo Juice-d

估计是,即使不添加参数,它也会使用存储过程开发人员选择的任何默认值—不一定为null。当然,他不需要检查它是否有值,因为它将直接传递到存储过程,是null还是其他?@Moo Juice SQL null与C null是不同的。要在C中提到SQL NULL,您需要说DBNull.Value。在这里,由于存储过程定义中的默认值如我们所愿为空,最简单的方法就是什么都不说。@Moo Juice-目的是,即使不添加参数,它也会使用存储过程开发人员选择的任何默认值-这不一定为空。哇,谢谢,我不知道有这么多方法可以剥猫皮!哇,谢谢,我不知道有这么多方法可以剥猫皮!谢谢,你能看一下我问题的更新部分吗?我得到一个错误,我不知道为什么。@Mark Allison-您已将参数设置为仅可为null int?MFEPips,。我已经让他们可选的以及int?mfepis=null,。看到extra=null了吗?谢谢,现在效果很好。我得去研究一下你提到的参数对象。谢谢,你能看看我问题的更新部分吗?我得到一个错误,我不知道为什么。@Mark Allison-您已将参数设置为仅可为null int?MFEPips,。我已经让他们可选的以及int?mfepis=null,。看到extra=null了吗?谢谢,现在效果很好。我必须去研究一下你所说的参数对象。你在参数声明中缺少了=null,这导致了你的错误。@Paddy-谢谢,需要咖啡……另外,我认为你可能需要将null转换为可为null的类型。例如智力?tradeGrade=int?null。您在参数声明中缺少了=null,这导致了您的错误。@Paddy-谢谢,需要咖啡……另外,我认为您可能需要将null转换为可为null的类型。例如智力?tradeGrade=int?空。