我可以在C#中使用不同的类型初始化类的公共属性吗?

在Java中,我可以有一个像这样的对象:

public class MyObject { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public void setDate(String date) { this.date = parseDateString(date); } private Date parseDateString(String date) { // do magic here return dateObj; } } 

这很好,因为我有一个吸气剂用于我的属性和多个二传手。 我可以通过传入Date对象或String来设置“date”属性,然后让类弄清楚它。

在C#中,看起来事情有点不同。 我可以做这个:

 public class MyObject { public DateTime Date { get; set; } } 

这里的速记显然是最佳的。 但是,我不确定是否有任何内置方法可以重置setter以接受多种类型。 我意识到我可以创建一个单独的公共方法来设置值,但这会牺牲使用对象初始化器的能力。

有没有办法直接重载C#公共属性的setter? 或者这仅仅是语言限制,而且无法完成?

所有其他答案都是正确的…但如果你坚持 ,你可以通过以下几种方式做到:

  1. 使用第二个属性只有一个setter:

     public string DateText { set { Date = ParseDateString(value); } } 

    尽可能避免这种情况,只会增加混乱:-)

  2. 使用方法而不是属性(与在Java中相同)。 方法可以重载。 这应该是最推荐的方式。

  3. 使用自定义类(而不是DateTime )并在DateTimestring和您的类之间提供隐式转换。 除非你打算在其他地方使用它,否则不推荐使用。

  4. 将属性更改为object并在setter中提供转换:请不要这样做

嗯,你把苹果和香蕉比较。 你在Java中有什么:

 public void setDate(Date date) { this.date = date; } public void setDate(String date) { this.date = parseDateString(date); } 

在C#中看起来像这样:

 public void SetDate(Date date) { this.date = date; } public void SetDate(String date) { this.date = ParseDateString(date); } 

唯一的区别是PascalCase成员名称和范围开放括号的位置。

您的Java代码有重载方法 ; 上面的C#有重载方法。

AFAIK你不能重载属性setter,因为:

 public DateTime Date { get { return this.date; } set { this.date = value; } } 

value的类型由成员的类型决定,这里是DateTime

所以如果你想要方法重载,重载方法 ,而不是属性 。 请记住,无论如何,C#属性只是getter和setter方法的语法糖。

自动属性不支持此function。 所以你必须像在Java中那样做。

当然你也可以混合这些:提供一个自动属性和额外的set方法来使用不同的类型设置属性。

 public class MyObject { public DateTime Date { get; set; } public void SetDate(string date) { this.Date = DateTime.Parse(date); } } 

我将写一个不同的答案并声称

 public void setDate(Date date) { this.date = date; } public void setDate(String date) { this.date = parseDateString(date); } 

开始是不好的做法。

通过执行上述操作,您声明字符串和日期都是Date有效值。 事实并非如此 – 你真正想要的是一个Date 。 如果用户有一个字符串并希望它转换为Date ,那么它们应该依赖于Date API中的字符串解析functionDateFormat.parse() Java中的DateFormat.parse() DateTime.Parse() ,C#中的DateTime.Parse() ,而不是您的API。

如果Date是您定义的类,并且您确实希望Datestring可以互换,那么您应该在Date类中使用隐式对话 ,而不是要求Date类的用户写入重载。