替代赋值运算符重载

时间:2011-05-18 17:44:56

标签: c#

首先让我说明我知道C#中的赋值运算符不能被重载/重写。但是,如果我有这样的课程:

public class Time
{

    private int Hour, Minute;
    public int minutes;

    public Time(int m)
    {
        this.minutes = m;
        this.Hour = m / 60;
        this.Minute = m % 60;
    }

    public Time(int hh, int mm)
    {
        this.minutes = 60 * hh + mm;
        this.Hour = hh;
        this.Minute = mm;
    } 

    public static explicit operator Time(int i1)
    {
        return new Time(i1);
    } 

}

两件事:

1)底部的显式转换过载是否必要?

2)我想做

Time newTime = 510;

并且小时分钟反映新的分钟。没有制作另一个对象,是制作这样一个函数的唯一方法:

    public void changeminutes(int m)
    {
        this.minutes = m;
        this.Hour = m / 60;
        this.Minute = m % 60;
    }

并执行此操作:

Time newTime = new Time();
newTime.changeminutes(510);

编辑:

我可能应该提到我还在学习C#。很多你的建议都飞过我的脑海。遗憾。

下一个编辑: 这不一定是时间。我只是用它来说明我的例子。

4 个答案:

答案 0 :(得分:3)

您可以创建从intTime的隐式演员。

但是,我建议不要这样做 除非它们介于等效类型之间(例如,intlong),否则隐式强制转换最终会造成很多混乱。
此外,这不应该是指分钟而不是秒。

您可以使用扩展方法创建更好的语法:

Time t = 510.Minutes();

答案 1 :(得分:1)

看起来你正试图让引用类型表现得像一个值类型,这是......呃,很棘手。如果您真的不想使用构造函数(并解释为什么这可能有助于我们回答),您可以使用静态“工厂”方法:

public static Time FromMinutes(int m)
{
  return new Time(m);
}

并像这样使用它:

var t = Time.FromMinutes(510);

这类似于TimeSpan class允许你做的事情。

答案 2 :(得分:0)

对于你的情况,隐式转换会起作用但是......

当您丢失数据时,不会使用转换,甚至在这种情况下也不会使用语义。您知道该号码将成为时间,但您不知道该号码将转换为哪个时间单位。

如果有人要阅读代码,那么在不查看Time类的内部定义的情况下,它将不知道数字代表什么。想想那是否属于外部项目。调试地狱? :)

答案 3 :(得分:0)

首先,你想使用implicit施法来实现Time x = 123;,但正如其他人指出它可能是一个糟糕的设计选择,因为它不能立即清楚数字代表什么(并且大多数人会假设一个Unix时间戳)。

其次,为什么不使用Minutes属性设置分钟,只需将值转换为适当的值,同时更改小时数?

time.Minutes = 510;

// in class def:

public int Minutes
{
    get { return minutes; }
    set
    {
        hours = value / 60;
        minutes = value % 60;
    }
}