如何通过重载+=运算符为Person类实例的不同属性赋值?
实现Person类的+=运算符重载来赋值不同类型属性
当然可以实现你想要的+=语法!C#支持为同一个运算符重载不同参数类型的版本,刚好能满足你的需求——通过不同类型的右值来给Person的对应属性赋值。
首先先修正一下你代码里的小拼写错误:IsMaried应该是IsMarried,下面的示例我已经改过来了。
修改后的Person类实现
class Person { public string Name { get; set; } public DateTime Birth { get; set; } public bool IsMarried { get; set; } // 重载+运算符,处理字符串赋值给Name public static Person operator +(Person person, string name) { person.Name = name; return person; } // 重载+运算符,处理DateTime赋值给Birth public static Person operator +(Person person, DateTime birthDate) { person.Birth = birthDate; return person; } // 重载+运算符,处理bool值赋值给IsMarried public static Person operator +(Person person, bool isMarried) { person.IsMarried = isMarried; return person; } public override string ToString() => $"{Name} was born on {Birth.ToShortDateString()} and is{(IsMarried ? "" : " not")} married"; }
使用示例
var person = new Person(); person += "Erick"; // 给Name赋值 person += new DateTime(1998, 10, 28); // 给Birth赋值 person += true; // 给IsMarried赋值 Console.WriteLine(person); // 输出结果:Erick was born on 10/28/1998 and is married
原理说明
C#里的+=运算符其实是编译器的语法糖,它会自动转换成person = person + value。所以我们只需要为Person类重载三个不同参数类型的+运算符即可:
- 当右值是
string时,修改Name属性 - 当右值是
DateTime时,修改Birth属性 - 当右值是
bool时,修改IsMarried属性
上面的实现是直接修改原实例后返回,如果你希望保持实例不可变(每次操作返回新对象),也可以这样写运算符:
public static Person operator +(Person person, string name) { return new Person { Name = name, Birth = person.Birth, IsMarried = person.IsMarried }; }
这种方式下,每次+=都会创建一个新的Person对象,原对象不会被修改,适合需要不可变对象的场景。
内容的提问来源于stack exchange,提问作者Erick Ruh Cardozo
相关产品推荐
相关产品推荐

