考虑以下代码:
class Program
{
static void Main(string[] args)
{
Department deathStar = new Department { Name = "Death Star" };
Console.WriteLine("The manager of {0} is {1}.", deathStar.Name, deathStar.Manager.FullName);
deathStar.Manager.FirstName = "Lord";
Console.WriteLine("The manager of {0} is {1}.", deathStar.Name, deathStar.Manager.FullName);
Console.ReadLine();
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName
{
get
{
return this.FirstName + " " + this.LastName;
}
}
}
public class Department
{
public string Name { get; set; }
public Person Manager { get; private set; }
public Department()
{
this.Manager = new Person { FirstName = "Darth", LastName = "Vader" };
}
}
产生以下输出:
The manager of Death Star is Darth Vader.
The manager of Death Star is Lord Vader.
即使我不能将Manager更改为Person(私有集访问器)的其他实例或新实例,也可以更改其属性(具有公共集访问器)。
因此,通过设置的访问器通过其容器的get访问器为属性分配值是否不好?换句话说,这是代码气味吗?
编辑:
这只是一个示例来说明这一点。仅为此样本创建人员和部门。
最佳答案
不必。
例如,查看SqlCommand对象上的参数集合。您可以更改集合中的项目,但不能将新的参数集合分配给命令对象。
以您的示例为例,如果您有一个维护Person对象的UI,并且您需要更改人员的名字,那么更改人员的名字,不使用姓氏和PersonId字段,然后使用PersonId更新数据库表是完全有效的领域。
对我来说一切都很好
关于c# - 通过设置的访问器通过其容器的get访问器为属性分配值是否不好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/853638/