考虑以下代码:

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/

10-10 00:49