C# 赋值运算符重载的替代方法
首先让我声明,我知道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
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