C# 赋值运算符重载的替代方法

C# 赋值运算符重载的替代方法,c#,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 Ti

首先让我声明,我知道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。你的许多建议我都听不懂。对不起

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

您可以创建一个从
int
Time
的隐式强制转换

但是,我建议不要这样做。
除非它们在等价类型之间(例如,
int
long
),否则隐式强制转换最终会造成很多混乱。
此外,这并不意味着几分钟而不是几秒钟

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

Time t = 510.Minutes();

您可以创建从
int
Time
的隐式强制转换

但是,我建议不要这样做。
除非它们在等价类型之间(例如,
int
long
),否则隐式强制转换最终会造成很多混乱。
此外,这并不意味着几分钟而不是几秒钟

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

Time t = 510.Minutes();

看起来您正试图使引用类型的行为类似于值类型,即。。。嗯,很棘手。如果您真的不想为此使用构造函数(并解释这可能有助于我们回答),可以使用静态“工厂”方法:

然后像这样使用它:

var t = Time.FromMinutes(510);

这与允许您执行的操作类似。

看起来您试图使引用类型的行为类似于值类型,即。。。嗯,很棘手。如果您真的不想为此使用构造函数(并解释这可能有助于我们回答),可以使用静态“工厂”方法:

然后像这样使用它:

var t = Time.FromMinutes(510);

这类似于允许您执行的操作。

对于您的情况,隐式转换可以工作,但

当您丢失数据,甚至像本例中这样的语义时,不能使用转换。你知道这个数字会变成一个时间,但你不知道这个数字会转换成哪一个时间单位


如果有人要阅读代码,如果不查看Time类的内部定义,它将不知道数字代表什么。想一想,如果这是一个外部项目。调试地狱?:)

对于您的情况,隐式转换是可行的,但是

当您丢失数据,甚至像本例中这样的语义时,不能使用转换。你知道这个数字会变成一个时间,但你不知道这个数字会转换成哪一个时间单位


如果有人要阅读代码,如果不查看Time类的内部定义,它将不知道数字代表什么。想一想,如果这是一个外部项目。调试地狱?:)

首先,您希望使用
隐式
转换来实现
时间x=123,但正如其他人所指出的,这可能是一个糟糕的设计选择,因为不清楚数字代表什么(大多数人都会假设Unix时间戳)

其次,为什么不使用Minutes属性来设置分钟数,并在更改小时数的同时将该值转换为正确的值呢

time.Minutes = 510;

// in class def:

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

首先,您希望使用
隐式
转换来实现
时间x=123,但正如其他人所指出的,这可能是一个糟糕的设计选择,因为不清楚数字代表什么(大多数人都会假设Unix时间戳)

其次,为什么不使用Minutes属性来设置分钟数,并在更改小时数的同时将该值转换为正确的值呢

time.Minutes = 510;

// in class def:

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

你是说
隐式
显式
相反吗?我建议不要实现
时间newTime=510功能。目前还不清楚分配了什么。在您的最后一段代码中,我不太了解时间实现,而是知道代码在做什么。如果代码不可用,
Time newTime=510将是一个巨大的????对于代码的读者来说。我建议遵循
DateTime
TimeSpan
类中的模式,以便进行良好的设计。@Inuyasha如是说。你可以看到我的答案作为例子。:)你应该使你的类不可变,也许把它变成一个
结构
。你是说
隐式
而不是
显式
?我建议不要实现
时间newTime=510功能。目前还不清楚分配了什么。在您的最后一段代码中,我不太了解时间实现,而是知道代码在做什么。如果代码不可用,
Time newTime=510将是一个巨大的????对于代码的读者来说。我建议遵循
DateTime
TimeSpan
类中的模式,以便进行良好的设计。@Inuyasha如是说。你可以看到我的答案作为例子。:)你应该使你的类不可变,也许把它变成一个
结构
+1。第一部分不确定,但第二部分回答了OP的问题“这是唯一的方法吗…”TBH,我还在学习C。这对我来说更多的是一种学习练习,而不是一些我需要知道的东西。我只是好奇,在这个过程中如何不创建新对象(我来自非垃圾收集语言)。这不一定与时间有关,我只是用它来说明我的例子。@Andrew:无论你做什么,你都不会制造额外的对象。+1对第一部分不确定,b