定义是必须的还是非必须的?[已结束]

Is defining a must or not? [closed]

提问人:Bagbaq 提问时间:7/26/2023 最后编辑:Bagbaq 更新时间:7/26/2023 访问量:89

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

4个月前关闭。

public List<ItemData> itemBase;当我声明此列表时,我可以在没有定义的情况下使用它,在声明变量时定义是否有好处?

public List<ItemData> itemBase = new List<ItemData>();

如果有人能解释,我将不胜感激。

编辑:

public List<ItemData> itemBase;
    
    
        ItemData i = new ItemData();
        i.itemName = "dsadsad";
        i.itemSprite = "lolo";
        ItemData i2 = new ItemData();
        i2.itemName = "dsadsad2";
        i2.itemSprite = "lolo2";
        itemBase.Add(i);
        itemBase.Add(i2);

你们说我不能使用.add功能,但我可以使用。是的,我在 ItemData i2 中定义,但我没有实例化列表,我只是实例化列表成员。

C# 列表 声明 定义

评论

4赞 jps 7/26/2023
我可以在没有定义的情况下使用它 - 你在第一种情况下尝试过吗?itemBase.Add(...)
0赞 Jon Skeet 7/26/2023
“当我声明这个列表时,我可以在没有定义的情况下使用它”——你说的“定义”是什么意思?这里缺少更多的初始化 - 因此该字段的默认值为 null。您只是没有为其分配初始值。
0赞 jps 7/26/2023
相关新闻: stackoverflow.com/questions/1410563/... @JonSkeet我理解了 OP,我很久以前就学会了相同的术语。
3赞 Jon Skeet 7/26/2023
@jps:这很可能是其他语言中使用的术语,但在 C# 中不是这样使用的。我确实明白,当你不熟悉一门语言时,使用正确的语言术语是很困难的——但我认为这是从一开始就尝试做的重要事情之一。
0赞 Robert Harvey 7/26/2023
您发布的代码不起作用。dotnetfiddle.net/MS7xAy。错误消息是“使用未分配的局部变量'itemBase'”,正如我所期望的那样。

答:

3赞 Robert Harvey 7/26/2023 #1
public List<ItemData> itemBase;

声明一个 类型的变量 。因为是引用类型,所以它的初始值是 。这是完全有效的 C# 代码,但如果您尝试对其执行方法,例如List<ItemData>List<ItemData>null

itemBase.Add(myItemData);

你将得到一个 null 引用异常,因为该变量没有引用任何可以执行 Add 方法的对象。

然后,当您将

itemBase = new List<ItemData>();

实例化 type 的对象并将其分配给 ,然后对该方法的调用将起作用。List<ItemData>itemBaseAdd

在 C# 中,值对变量的初始(第一次)赋值称为初始化。

评论

1赞 JonasH 7/26/2023
可能值得一提的是“Target typed new”,即List<ItemData> itemBase = new ();
0赞 Robert Harvey 7/26/2023
@jonasH 或 .var itemBase = new List<ItemData>();
0赞 Ralf 7/26/2023
@JonasH 在拥有坚实的语言基础之前,我们应该尽量不要让新生与语言的捷径混淆。
0赞 JonasH 7/26/2023
是的,但是对于字段/属性,如果您不想重复该类型,则需要使用 target typed new。当然,目前还不完全清楚 OP 是在询问字段还是局部变量。