重构代码,使用if将参数设为可选

时间:2019-01-24 14:43:54

标签: c#

我有代码,有时候我需要用一些东西填充“ Parameter1”,有时没有,我是否可以重构代码,所以我不需要用If或某些东西重复代码:Name =“ Adam”?

 public class Address
{
    public string Name { get; set; }
    public string City { get; set; }
    public string Parameter1 { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {

        var VariableParameter1_On = false;
        var address = new Address();
        if (VariableParameter1_On)
        {
            address = new Address
            {
                Name = "Adam",
                City = "Paris",
                Parameter1 = "Test"
            };
        }
        else
        {
            address = new Address
            {
                Name = "Adam",
                City = "Paris",
                Parameter1 = "Test"  //Make this optional with if?
            };
        }

        Console.ReadKey();

    }
}

4 个答案:

答案 0 :(得分:3)

您可能正在寻找将字段设置为nullreference)。我们也可以使用inline if statement

将您的Main方法替换为:

var VariableParameter1_On = false;
var address = new Address
{
    Name = "Adam",
    City = "Paris",
    Parameter1 = VariableParameter1_On ? "Test" : null;
};

Console.ReadKey();

我假设Parameter1reference type(例如,一个类),可以将其设置为null,而不是值类型(例如,struct或enum),它< em>必须分配一个值。

答案 1 :(得分:1)

无论哪种情况,您都需要使用Name和City的值实例化该对象。唯一可选的部分是Parameter1的值,或者缺少它。

您当前的代码实例化一个空的Address对象,然后立即将其重新分配。您真正需要做的就是实例化一个新的Address,并为其分配NameAddress的值,然后在您的Parameter1语句中分配if

public class Program
{
    static void Main(string[] args)
    {

        var VariableParameter1_On = false;
        var address = new Addressaddress = new Address { Name = "Adam", City = "Paris" };

        if (VariableParameter1_On)
            address.Parameter1 = "Test";


        Console.ReadKey();

    }
}

答案 2 :(得分:1)

使用带有可选参数的构造函数。

//Both these calling examples are fine.
Address a = new Address("Peter", "New york");
Address b = new Address("Peter", "New york", "some parameter");

public class Address
{
    public Address(string name, string city, string parameter1 = null)
    {
        Name = name;
        City = city;
        Parameter1 = parameter1;
    }

    public string Name{ get; set; }
    public string City{ get; set; }
    public string Parameter1{ get; set; }
}

然后初始化一个变量,或者对其进行设置,始终将其传递给Address的构造函数。

var parameter = null;
//Does not matter if the method returns an empty string or an actual value, we initialized it and will pass it anyway.
parameter = SetParameterBasedOnSettingsOrWhatever();
Address b = new Address("Peter", "New york", parameter);

答案 3 :(得分:0)

仅出于可读性和良好命名的原因,请尝试尽可能多地使用类型。 也许您也可以尝试将支票封装在特定方法中,以提高可读性。

static void Main(string[] args)
{
    bool isParamaterMandatory = true;
    Address address = new Address()
    {
        City = "Paris",
        Name = "Adam",
        Parameter1 = GetParameterIfNeeded(isParamaterMandatory)
    };

    Console.ReadKey();

}

private static string GetParameterIfNeeded(bool isNeeded)
{
    if (isNeeded)
    {
        return "Mandatory";
    }

    return null;
}