声明“Nullable<string>[]”或“string[]?”对于可能存在或不存在于类中的字符串数组属性?

Posted

技术标签:

【中文标题】声明“Nullable<string>[]”或“string[]?”对于可能存在或不存在于类中的字符串数组属性?【英文标题】:Declare "Nullable<string>[]" or "string[]?" for string array property that may or may not exist inside a class? 【发布时间】:2021-04-20 05:55:23 【问题描述】:

我有一个这样的 JSON 文件:

[
  
    "Id": 1,
    "Size": "big",
    "Order": 6
  ,
  
    "Id": 2,
    "Size": "small",
    "Order": 4
  ,
  
    "Id": 3,
    "Size": "medium",
    "Order": 2,
    "chips": []
  
]

chips 属性是一个数组,它可能出现在某些对象中,也可能不出现(此时它为空)。我应该像这样声明 json 文件的类吗:

 public class Settings
     
        public int Id  get;
        public string Size  get;
        public int Order  get;
        public string[]? Chips  get;
    

与 ?还是类似 Nullable[] 之类的属性?

【问题讨论】:

你试过了吗?您只能将 Nullable 与值类型一起使用。 @MikNiller docs.microsoft.com/en-us/dotnet/csharp/nullable-references @MikNiller 谢谢你,所以在功能方面它们是相同的,只是我猜的编译器警告不同。 有什么顾虑?如果集合为空或 null,您想避免使用此属性吗?或者关于type?[] vs type[]? vs type[]的问题,像这样***.com/questions/54010316/…? @Mik 是的,你不需要需要可为空的引用类型,但如果你想声明一个数组可以为空,请使用string[]? 【参考方案1】:

简而言之:在这种情况下,您根本不需要 Nullable&lt;T&gt;?

string[] 是引用类型:

Console.WriteLine(typeof(string[]).IsValueType);

打印输出将是false

所以,它可以是null 没有任何装饰。


回到您的示例。您还需要指定设置器才能反序列化给定的 json 片段:

public class Settings

    public int Id  get; set; 
    public string Size  get; set; 
    public int Order  get; set; 
    public string[] Chips  get; set; 

因为***实体不是对象,所以您需要先使用JArray 对其进行解析,然后通过ToObject (1) 将其转换为Settings

var json = "[\r\n  \r\n    \"Id\": 1,\r\n    \"Size\": \"big\",\r\n    \"Order\": 6\r\n  ,\r\n  \r\n    \"Id\": 2,\r\n    \"Size\": \"small\",\r\n    \"Order\": 4\r\n  ,\r\n  \r\n    \"Id\": 3,\r\n    \"Size\": \"medium\",\r\n    \"Order\": 2,\r\n    \"chips\": []\r\n  \r\n]";
var semiParsedData = JArray.Parse(json);
var settings = semiParsedData.ToObject<Settings[]>();

【讨论】:

以上是关于声明“Nullable<string>[]”或“string[]?”对于可能存在或不存在于类中的字符串数组属性?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中函数声明变量声明以及变量赋值之间的关系与影响

声明那回事儿

Go语言基础之变量声明

C#显式声明隐式声明是怎么定义的

JavaScript 函数声明和变量声明

在C语言中声明和定义的区别?