我有代码,有时候我需要用一些东西填充“ 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();
}
}
答案 0 :(得分:3)
您可能正在寻找将字段设置为null
(reference)。我们也可以使用inline if statement。
将您的Main
方法替换为:
var VariableParameter1_On = false;
var address = new Address
{
Name = "Adam",
City = "Paris",
Parameter1 = VariableParameter1_On ? "Test" : null;
};
Console.ReadKey();
我假设Parameter1
是reference type(例如,一个类),可以将其设置为null
,而不是值类型(例如,struct或enum),它< em>必须分配一个值。
答案 1 :(得分:1)
无论哪种情况,您都需要使用Name和City的值实例化该对象。唯一可选的部分是Parameter1
的值,或者缺少它。
您当前的代码实例化一个空的Address
对象,然后立即将其重新分配。您真正需要做的就是实例化一个新的Address
,并为其分配Name
和Address
的值,然后在您的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;
}