【问题标题】:What does "initializing an instance of a class" mean?“初始化一个类的实例”是什么意思?
【发布时间】:2021-12-31 04:21:01
【问题描述】:

阅读Meanings of declaring, instantiating, initializing and assigning an object 后,它谈到了初始化变量的含义。但它没有解释“初始化”一个类的实例是什么意思。

public class Test
{
   public static void Main()
   {
      Person person1 = new Person();
   }
}

public class Person
{
   // body
}

初始化一个类的实例是什么意思?

【问题讨论】:

  • 我认为某些术语会混淆、互换和使用不正确。我会说初始化是在创建类的实例时实际分配内部初始变量值的地方。
  • 在你的例子中,这就像创建一个新的人,在它的初始条件下,你也在为那个人分配空间(我认为)。
  • 我觉得相当于“初始化新对象的数据成员”。
  • 类是对象的定义——它描述了它拥有什么数据以及它可以执行什么操作。实例是基于类定义的实际内存分配。初始化实例是将分配给实例的内存设置为在字段或构造函数中定义的默认值。
  • @XUnitDown 是的。

标签: c# instance


【解决方案1】:

是的,我也不太喜欢链接答案的“初始化”,因为它实际上只谈论为单个变量赋值,并没有真正区分实例化和赋值(相同在所有这些中都可以找到代码行)所以对我来说有点模糊。当我们谈论初始化时,我们确实有更具体的过程(尤其是现在的现代 c# 语法)


初始化通常意味着“给创建的实例一些初始值”。你的类 Person 没有什么要初始化的,所以你可以说只要重新(实例化)它,你就已经完成了所有可能的初始化,它可以使用了

让我们有一些可以设置值的东西

public class Person{
  public string Name {get;set;}
  public string Address {get;set;}

  public Person(string name){
    if(name == null) throw new ArgumentNullException(nameof(name));
    Name = name;
  }
}

作为构造的一部分进行初始化:

p = new Person("John");

构造函数迫使我们提供值,并用于确保开发人员为类提供工作所需的最少数据集。Person 必须有名称。地址是可选的。我们创建了一个名字初始化为 John 的人

初始化后期构造

您可以在构造实例后为其提供附加(可选)值,例如

p = new Person("Bill");
p.Address = "1 Microsoft Way";

或者

p = new Person("Bill"){
  Address = "1 Microsoft Way"
}

编译器将其展开为类似于第一个的语法糖。我们将第二个示例的{ } 括号中的所有内容称为“对象初始值设定项”。但这里的一个重要区别是第一种形式 (p.Address=...) 不被编译器视为初始化。如果您将地址属性设为:

public string Address {get;init;}

那么只能在构造函数或对象初始化器中设置,也就是上面的后一种形式。如果使用init 声明属性,p.Address=... 表单将导致编译器错误

在构造之后设置的道具是初始化过程的一部分(作为英语/语言的东西),但如果它更进一步,我不会称之为 init,例如

p = new Person("Sam");

string addr = Console.ReadLine();

p.Address = addr; //not initialization

您可能会发现人们在“第一次为变量或属性赋予值”的意义上谈论初始化,但这也更像是语言/英语的事情,而不是 c# 的事情


编译器知道如何执行其他初始化,所以我们也称这样的东西为“初始化器”:

string[] x = new string[] {"a","b","c"};

给数组这3个值的过程是初始化,编译器甚至会取第一个参数的类型并用它来制作数组类型,因此可以从数据中对数组进行类型声明和点燃:

var x = new[] {"a","b","c"};

【讨论】:

  • 当然,你可以这么说。构造函数始终运行,对象初始化器是可选的,因此“仅通过对象 init'r”并不是那么合乎逻辑,但您可能会声称空的构造函数没有初始化 - 我怀疑大多数普通人会足够关心接受有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2013-07-16
  • 2020-07-17
  • 2017-06-27
相关资源
最近更新 更多