c#基础知识有个点不怎么懂?

c#中定义字符串数组用:
string[] str = { "张三", "李四" };
为什么不是:
string[] str = ["张三", "李四"];

阅读 2.1k
3 个回答

C# 里没有类似 JS 数组/对象字面量的那种写法,除了基础类型外,其他类型都得 new 出来赋值。

你这里其实是一个简写形式的语法糖,完整写法是:

string[] arr = new string[2] { "a", "b" };

后面的 new string[2] 可省略,编译器会根据你前面变量声明限定的类型、以及后面的元素数量自动推断。

这种语法糖叫做“静态初始化”,跟 Java 是一样的:

String[] arr = { "a", "b" };

甚至这个所谓的“完整写法”,本身也是一种简写语法糖,其真正的完整写法是:

string[] arr = new string[2];
arr[0] = "a";
arr[1] = "b";

但跟 Java 不同的是,C# 里任何集合类型(Collections)都可以通过静态初始化的语法糖快速初始化并填充数据:

List<string> list = new List<string>() { "a", "b" };

Dictionary<string, string> map = new Dictionary<string, string>() 
{
   { "k1", "v1" },
   { "k2", "v2" }
};

而 Java 只有数组有这种快速填充的语法糖,其他诸如 ArrayList 的对象只能 new 完以后老老实实挨个往里 add。

P.S. 楼上简直胡说八道,这里的花括号跟数组根本就没关系,扯什么语法强制规定,估计是 ChatGPT 生成的答案。

emm,好吧,被当作机器人了(其实自己的学习能力和思考能力离机器人有着很大的差距,能被当作机器人是一种荣幸)
在vc上重新试了试,查阅了一下自己曾经的笔记资料,可能是之前回答里的用语不当,花括号是给数组赋初值时候使用,例如:
int a[3] = {1, 2, 3};

我将它称之为c语言“强制规范”的说法应该是不正确的,对这个回答没能帮助到提问同学甚至是误导了提问同学表示歉意,同时真诚感谢楼上同学的指正。@然后去远足

这是一个细节问题,也是一个很基础的问题,因为代码过于讲究能跑,功能能用,调试没问题,忽略了这些基础知识的用语考量。对于基础的忽视值得自己检讨。

最后补充一个对这个问题回答相对权威的博客资料作为本问题的结尾,希望可以帮助到提问的同学,同时,也留给自己学习更多的思考:
https://www.cnblogs.com/yilangUAV/p/12628932.html

新手上路,请多包涵

现在,C# 12 提供了第二种写法的语法糖~

(后面摘自 C# 12 中的新增功能 - C# 指南 - C# | Microsoft Learn

集合表达式

集合表达式引入了一种新的简洁语法来创建通用集合值。可以使用展开运算符 .. 将其他集合内联到这些值中。

可以创建多个类似集合的类型,而无需使用外部 BCL 支持。这些类型包括:

  • 数组类型,例如 int[]
  • System.Span<T>System.ReadOnlySpan<T>
  • 支持集合初始值设定项的类型,例如 System.Collections.Generic.List<T>

以下示例演示了集合表达式的使用:

// 创建数组
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];

// 创建列表:
List<string> b = ["one", "two", "three"];

// 创建 Span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];

// 创建锯齿 2D 数组:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

// 从变量创建锯齿 2D 数组:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

展开运算符(集合表达式中的 ..)可将其参数替换为该集合中的元素。参数必须是集合类型。以下示例演示了展开运算符的工作原理:

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{
    Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

展开运算符的操作数是可以枚举的表达式。展开运算符可计算枚举表达式的每个元素。

可以在需要元素集合的任何位置使用集合表达式。它们可以指定集合的初始值,也可以作为参数传递给采用集合类型的方法。可以在有关集合表达式的语言参考文章功能规范中详细了解集合表达式。

logo
Microsoft
子站问答
访问
宣传栏