Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构造函数中有一个参数但有多个字段?他们为什么使用它?什么时候使用?_C#_Oop_Constructor - Fatal编程技术网

C# 构造函数中有一个参数但有多个字段?他们为什么使用它?什么时候使用?

C# 构造函数中有一个参数但有多个字段?他们为什么使用它?什么时候使用?,c#,oop,constructor,C#,Oop,Constructor,假设我正在使用这个代码。您的典型构造函数与方括号内的字段具有相同的参数,但这一个没有——这比我预期的更常见 public class PetOwner { private readonly string OwnerName; private readonly List<PetAnimal> Pets; public PetOwner(string name) { OwnerNam

假设我正在使用这个代码。您的典型构造函数与方括号内的字段具有相同的参数,但这一个没有——这比我预期的更常见

    public class PetOwner
    {
        private readonly string OwnerName;
        private readonly List<PetAnimal> Pets;

        public PetOwner(string name)
        {
            OwnerName = name;
            Pets = new List<PetAnimal>();
        }
    }

为什么以及何时使用?

示例一

在第一个示例中,
OwnerName
作为参数,而
Pets
则通过实例初始化。这是以任何有意义的方式实际使用字段所必需的。作为只读,它必须在这里发生

也可以通过构造函数调用提交
Pet
集合。设计器选择不这样做,但在创建后,从现有集合或使用数组初始值设定项设置/初始化它并不困难

我最好的猜测是,为什么集合通常不在构造函数中赋值,这是异常的危险。填充或扩展集合的操作很容易出现OOM异常。虽然危险也存在于任何
新的
操作中,但在任何实际的数组写入操作中,这种危险的可能性更大

示例二

在第二个示例中,
OwnerName
作为参数,而静态变量
ownerCounter
增加

通过静态字段共享数据是初学者最常见的静态错误。除了学习例子之外,你应该像避免瘟疫一样避免它。如果该字段为常量或只读,则静态性质将不重要。但这个是可写的

如果您以后需要一个具有两个不同所有者计数的程序,该怎么办?(比如脊椎动物和无脊椎动物)。你们班不能这样做。它不可伸缩

如果有人想进行这种计数,通常他的工作就是跟踪它。这是只有使用类的代码才能可靠地完成的事情。同样的原因是,在所有并发集合中,我们没有并发列表。索引本质上容易出现竞争条件,List类无法阻止它


用户可能还拥有一组PetOwner实例,因此实际上只需调用
.Lenght
.Count
即可获得该数字。一些如此容易解决的问题不值得在内部追踪。我回答这些问题是因为我喜欢这样的问题。因为我喜欢关于代码的废话,当人们在代码中做出愚蠢的事情时,我会大笑

这就是它。这里的关键词是“动机”。我可以在这里看到

publicpetowner(字符串名称)
{
OwnerName=名称;
Pets=新列表();
}
设计师显然希望确保pets列表始终存在(
!=null
),并且您只能添加/删除它们,并且您不能让
PetOwner
没有名称,因此,您必须在构造函数中完全初始化它。这就解释了这种特殊的设计

而且,不,这不是“与字段具有相同参数”的“典型构造函数”。想象一个有20个字段的类。。您向构造函数添加的内容是完全初始化对象所需的内容。如果字段很多,只需创建一个包装器对象并将其传递给构造函数

底线-你的设计。如果你为其他人(人们)创建了消费类,你基本上会考虑他们将如何使用它,并且你试图关闭所有阻止他们做蠢事的漏洞。例如,这里我要补充一点

if (string.IsNullOrEmpty(name))
    throw new ArgumentNullException();
关闭一个没有名字所有者的洞。
因此,我的动机是简化其他开发人员的使用,简化他们的生活,同时支持良好的实践和设计。有时您会让对象保持打开状态,即-添加无参数构造函数。在这种情况下,它可能无法完全初始化,但某些框架(如依赖注入)可能需要这样的构造函数。

谁说它是最典型的?我强烈怀疑这是一个可能会被关闭的代码设计问题,所以请看这可能会帮助您让我给您一个提示-如果您过早接受答案,人们将不再研究您的问题,您可能会错过更多有趣的答案。特别是关于这样的问题,这可能会引起一场很好的讨论。好吧,我没有回答。有很多有趣的例子可以说明这种行为。非常感谢你的回复,T.S.和Christopher的帖子都回答了我的问题。有没有办法使两者都成为公认的答案?我问这个是因为我已经进入了编程的第二年(需要学习一些东西,html、C#(我最喜欢的语言)、java、css、php、javascript、xlts、xml、xpath、MySQL、Bootstrap等等,这让我很困惑。
if (string.IsNullOrEmpty(name))
    throw new ArgumentNullException();